コード例 #1
0
        public virtual IList <FlowElement> Execute(ICommandContext commandContext)
        {
            Cfg.ProcessEngineConfigurationImpl processEngineConfiguration = commandContext.ProcessEngineConfiguration;
            Interceptor.ICommandExecutor       commandExecutor            = processEngineConfiguration.CommandExecutor;

            IHistoricActivityInstanceQuery query = processEngineConfiguration.HistoryService.CreateHistoricActivityInstanceQuery()
                                                   .SetProcessInstanceId(processInstanceId);

            if (finished.HasValue)
            {
                if (finished.Value)
                {
                    query.SetFinished();
                }
                else
                {
                    query.SetUnfinished();
                }
            }

            IList <IHistoricActivityInstance> list = query.OrderByHistoricActivityInstanceStartTime().Desc().List();

            string              processDefinitionId = list[0].ProcessDefinitionId;
            Process             process             = ProcessDefinitionUtil.GetProcess(processDefinitionId);
            IList <FlowElement> elements            = new List <FlowElement>();

            foreach (var actInst in list)
            {
                elements.Add(process.GetFlowElement(actInst.ActivityId, true));
            }

            return(elements.Distinct().ToList());
        }
コード例 #2
0
        private void DeleteTasks(ICommandContext commandContext, Interceptor.ICommandExecutor commandExecutor, IExecutionEntity execution, IExecutionEntityManager executionEntityManager, List <ITask> tasks)
        {
            foreach (ITaskEntity delTask in tasks)
            {
                commandExecutor.Execute(new AddCommentCmd(delTask.Id, delTask.ProcessInstanceId, returnToReason));

                commandContext.TaskEntityManager.DeleteTask(delTask, returnToReason, false, false);
            }

            DeleteExecutions(execution, true, returnToReason, commandContext);
        }
コード例 #3
0
        private void ReturnToTasks(ICommandContext commandContext, Interceptor.ICommandExecutor commandExecutor, IExecutionEntity execution, IExecutionEntityManager executionEntityManager, List <ITask> tasks)
        {
            foreach (ITaskEntity delTask in tasks)
            {
                IActivitiEventDispatcher eventDispatcher = commandContext.ProcessEngineConfiguration.EventDispatcher;
                if (eventDispatcher.Enabled)
                {
                    eventDispatcher.DispatchEvent(ActivitiEventBuilder.CreateTaskReturnEntityEvent(delTask, returnToActivityId));
                }

                commandExecutor.Execute(new AddCommentCmd(delTask.Id, delTask.ProcessInstanceId, returnToReason));

                commandContext.TaskEntityManager.DeleteTask(delTask, returnToReason, false, false);
            }

            DeleteExecutions(execution, true, returnToReason, commandContext);
        }
コード例 #4
0
        public virtual object Execute(ICommandContext commandContext)
        {
            lock (syncRoot)
            {
                ProcessEngineConfigurationImpl processEngineConfiguration = commandContext.ProcessEngineConfiguration;
                Interceptor.ICommandExecutor   commandExecutor            = processEngineConfiguration.CommandExecutor;

                ITaskEntity task = commandExecutor.Execute(new GetTaskByIdCmd(currentTaskId)) as ITaskEntity;
                if (task is null)
                {
                    throw new ActivitiObjectNotFoundException(string.Concat("No task found for id '", currentTaskId));
                }

                string           currentExecutionId = task.ExecutionId;
                IExecutionEntity execution          = task.Execution;
                if (execution is null)
                {
                    throw new ActivitiObjectNotFoundException(string.Concat("No execution found for id '", currentExecutionId));
                }

                var flowElement = ProcessDefinitionUtil.GetFlowElement(execution.ProcessDefinitionId, returnToActivityId);
                if (flowElement is null)
                {
                    throw new ActivitiObjectNotFoundException(string.Concat("No execution found for id '", currentExecutionId, "'"));
                }

                IHistoricActivityInstanceEntity hisInst = processEngineConfiguration.HistoryService.CreateHistoricActivityInstanceQuery()
                                                          .SetProcessInstanceId(execution.ProcessInstanceId)
                                                          .SetActivityId(returnToActivityId)
                                                          .OrderByHistoricActivityInstanceStartTime()
                                                          .Desc()
                                                          .List()
                                                          .FirstOrDefault() as IHistoricActivityInstanceEntity;

                IExecutionEntityManager executionEntityManager = commandContext.ExecutionEntityManager;

                IExecutionEntity returnToExec = executionEntityManager.CreateChildExecution(execution.ProcessInstance);
                returnToExec.CurrentFlowElement = flowElement;
                foreach (var key in variables.Keys)
                {
                    returnToExec.SetVariable(key, variables[key]);
                }

                executionEntityManager.Insert(returnToExec);

                commandContext.Agenda.PlanContinueProcessOperation(returnToExec);

                IExecutionEntity miRoot = commandExecutor.Execute(new GetMultiInstanceRootExecutionCmd(execution));

                List <ITask> tasks = new List <ITask>();
                if (miRoot != null)
                {
                    ITaskQuery query = commandContext.ProcessEngineConfiguration.TaskService.CreateTaskQuery();

                    IEnumerable <IExecutionEntity> childExecutions = commandExecutor.Execute(new GetChildExecutionsCmd(miRoot));

                    query.SetExecutionIdIn(childExecutions.Select(x => x.Id).ToArray());

                    tasks.AddRange(query.List());
                }
                else
                {
                    tasks.Add(task);
                }

                DeleteTasks(commandContext, commandExecutor, miRoot != null ? miRoot : execution, executionEntityManager, tasks);

                return(null);
            }
        }