protected internal virtual IHistoricActivityInstanceEntity CreateHistoricActivityInstanceEntity(IExecutionEntity execution) { IIdGenerator idGenerator = ProcessEngineConfiguration.IdGenerator; string processDefinitionId = execution.ProcessDefinitionId; string processInstanceId = execution.ProcessInstanceId; IHistoricActivityInstanceEntity historicActivityInstance = HistoricActivityInstanceEntityManager.Create(); historicActivityInstance.Id = idGenerator.GetNextId(); historicActivityInstance.ProcessDefinitionId = processDefinitionId; historicActivityInstance.ProcessInstanceId = processInstanceId; historicActivityInstance.ExecutionId = execution.Id; historicActivityInstance.ActivityId = execution.ActivityId; if (execution.CurrentFlowElement != null) { historicActivityInstance.ActivityName = execution.CurrentFlowElement.Name; historicActivityInstance.ActivityType = ParseActivityType(execution.CurrentFlowElement); } DateTime now = Clock.CurrentTime; historicActivityInstance.StartTime = now; // Inherit tenant id (if applicable) if (execution.TenantId is object) { historicActivityInstance.TenantId = execution.TenantId; } HistoricActivityInstanceEntityManager.Insert(historicActivityInstance); return(historicActivityInstance); }
// Activity related history /// <summary> /// /// </summary> /// <param name="executionEntity"></param> public virtual void RecordActivityStart(IExecutionEntity executionEntity) { if (IsHistoryLevelAtLeast(HistoryLevel.ACTIVITY)) { if (executionEntity.ActivityId != null && executionEntity.CurrentFlowElement != null) { // Historic activity instance could have been created (but only in cache, never persisted) // for example when submitting form properties IHistoricActivityInstanceEntity historicActivityInstanceEntityFromCache = GetHistoricActivityInstanceFromCache(executionEntity.Id, executionEntity.ActivityId, true); IHistoricActivityInstanceEntity historicActivityInstanceEntity; if (historicActivityInstanceEntityFromCache != null) { historicActivityInstanceEntity = historicActivityInstanceEntityFromCache; } else { historicActivityInstanceEntity = CreateHistoricActivityInstanceEntity(executionEntity); } // Fire event IActivitiEventDispatcher activitiEventDispatcher = EventDispatcher; if (activitiEventDispatcher != null && activitiEventDispatcher.Enabled) { activitiEventDispatcher.DispatchEvent(ActivitiEventBuilder.CreateEntityEvent(ActivitiEventType.HISTORIC_ACTIVITY_INSTANCE_CREATED, historicActivityInstanceEntity)); } } } }
/// <summary> /// /// </summary> /// <param name="parentExecution"></param> /// <param name="subProcessInstance"></param> /// <param name="initialElement"></param> public virtual void RecordSubProcessInstanceStart(IExecutionEntity parentExecution, IExecutionEntity subProcessInstance, FlowElement initialElement) { if (IsHistoryLevelAtLeast(HistoryLevel.ACTIVITY)) { IHistoricProcessInstanceEntity historicProcessInstance = HistoricProcessInstanceEntityManager.Create(subProcessInstance); // Fix for ACT-1728: startActivityId not initialized with subprocess instance if (historicProcessInstance.StartActivityId is null) { historicProcessInstance.StartActivityId = initialElement.Id; } HistoricProcessInstanceEntityManager.Insert(historicProcessInstance, false); // Fire event IActivitiEventDispatcher activitiEventDispatcher = EventDispatcher; if (activitiEventDispatcher != null && activitiEventDispatcher.Enabled) { activitiEventDispatcher.DispatchEvent(ActivitiEventBuilder.CreateEntityEvent(ActivitiEventType.HISTORIC_PROCESS_INSTANCE_CREATED, historicProcessInstance)); } IHistoricActivityInstanceEntity activitiyInstance = FindActivityInstance(parentExecution, false, true); if (activitiyInstance != null) { activitiyInstance.CalledProcessInstanceId = subProcessInstance.ProcessInstanceId; } } }
/// <summary> /// /// </summary> /// <param name="task"></param> public virtual void RecordTaskId(ITaskEntity task) { if (IsHistoryLevelAtLeast(HistoryLevel.ACTIVITY)) { IExecutionEntity execution = task.Execution; if (execution != null) { IHistoricActivityInstanceEntity historicActivityInstance = FindActivityInstance(execution, false, true); if (historicActivityInstance != null) { historicActivityInstance.TaskId = task.Id; } } } }
/// <summary> /// /// </summary> /// <param name="variable"></param> /// <param name="sourceActivityExecution"></param> /// <param name="useActivityId"></param> public virtual void RecordHistoricDetailVariableCreate(IVariableInstanceEntity variable, IExecutionEntity sourceActivityExecution, bool useActivityId) { if (IsHistoryLevelAtLeast(HistoryLevel.FULL)) { IHistoricDetailVariableInstanceUpdateEntity historicVariableUpdate = HistoricDetailEntityManager.CopyAndInsertHistoricDetailVariableInstanceUpdateEntity(variable); if (useActivityId && sourceActivityExecution != null) { IHistoricActivityInstanceEntity historicActivityInstance = FindActivityInstance(sourceActivityExecution, false, false); if (historicActivityInstance != null) { historicVariableUpdate.ActivityInstanceId = historicActivityInstance.Id; } } } }
public virtual IHistoricActivityInstanceEntity FindActivityInstance(IExecutionEntity execution, string activityId, bool createOnNotFound, bool endTimeMustBeNull) { // No use looking for the HistoricActivityInstance when no activityId is provided. if (activityId is null) { return(null); } string executionId = execution.Id; // Check the cache IHistoricActivityInstanceEntity historicActivityInstanceEntityFromCache = GetHistoricActivityInstanceFromCache(executionId, activityId, endTimeMustBeNull); if (historicActivityInstanceEntityFromCache != null) { return(historicActivityInstanceEntityFromCache); } // If the execution was freshly created, there is no need to check the database, // there can never be an entry for a historic activity instance with this execution id. if (!execution.Inserted && !execution.ProcessInstanceType) { // Check the database IList <IHistoricActivityInstanceEntity> historicActivityInstances = HistoricActivityInstanceEntityManager.FindUnfinishedHistoricActivityInstancesByExecutionAndActivityId(executionId, activityId); if (historicActivityInstances.Count > 0) { return(historicActivityInstances[0]); } } if (execution.ParentId is object) { IHistoricActivityInstanceEntity historicActivityInstanceFromParent = FindActivityInstance(execution.Parent, activityId, false, endTimeMustBeNull); // always false for create, we only check if it can be found if (historicActivityInstanceFromParent != null) { return(historicActivityInstanceFromParent); } } if (createOnNotFound && activityId is object && ((execution.CurrentFlowElement != null && execution.CurrentFlowElement is FlowNode) || execution.CurrentFlowElement == null)) { return(CreateHistoricActivityInstanceEntity(execution)); } return(null); }
/// <summary> /// /// </summary> /// <param name="task"></param> public virtual void RecordTaskAssignment(ITaskEntity task) { IExecutionEntity executionEntity = task.Execution; if (IsHistoryLevelAtLeast(HistoryLevel.ACTIVITY)) { if (executionEntity != null) { IHistoricActivityInstanceEntity historicActivityInstance = FindActivityInstance(executionEntity, false, true); if (historicActivityInstance != null) { historicActivityInstance.Assignee = task.Assignee; historicActivityInstance.AssigneeUser = task.AssigneeUser; } } } }
/// <summary> /// /// </summary> /// <param name="executionEntity"></param> /// <param name="deleteReason"></param> public virtual void RecordActivityEnd(IExecutionEntity executionEntity, string deleteReason) { if (IsHistoryLevelAtLeast(HistoryLevel.ACTIVITY)) { IHistoricActivityInstanceEntity historicActivityInstance = FindActivityInstance(executionEntity, false, true); if (historicActivityInstance != null) { historicActivityInstance.markEnded(deleteReason); // Fire event IActivitiEventDispatcher activitiEventDispatcher = EventDispatcher; if (activitiEventDispatcher != null && activitiEventDispatcher.Enabled) { activitiEventDispatcher.DispatchEvent(ActivitiEventBuilder.CreateEntityEvent(ActivitiEventType.HISTORIC_ACTIVITY_INSTANCE_ENDED, historicActivityInstance)); } } } }
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); } }