流程跳转到父流程"/>
Activiti7工作流引擎:高阶篇(三) CallActivityTask 子流程跳转到父流程
知识传送门 》》》》》》》》》》》》》》》》》
一:SubProcess简单示例
@Test
public void delopyAllBpmn() {ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();processEngine.getRepositoryService().createDeployment().addClasspathResource("bpmn/LeaveProcess2.bpmn").name("请假流程").deploy();processEngine.getRepositoryService().createDeployment().addClasspathResource("bpmn/LeaveProcess1.bpmn").name("请假流程2").deploy();processEngine.getRuntimeService().startProcessInstanceByKey("LeaveProcess1");TaskService taskService = processEngine.getTaskService();Task task = taskService.createTaskQuery().singleResult();taskService.setAssignee(task.getId(), "zhangsan");taskServiceplete(task.getId());
}
二:从子流程内部跳转到父流程
- 删除子流程执行流相关的任务办理人
- 删除子流程实例对应的任务办理人
- 删除子流程对应的变量
- 删除当前任务
- 删除子流程执行流
- 删除子执行实例
- 设置当前的执行活动
public class Sub2ParentCommand implements Command<Object> {private String currentTaskId;private String targetTaskDefKey;public Sub2ParentCommand(String currentTaskId, String targetTaskDefKey) {this.currentTaskId = currentTaskId;this.targetTaskDefKey = targetTaskDefKey;}@Overridepublic Object execute(CommandContext commandContext) {// 根据当前任务id查找当前正在执行的任务TaskEntityManager taskEntityManager = commandContext.getTaskEntityManager();TaskEntity taskEntity = taskEntityManager.findById(currentTaskId);ExecutionEntityManager executionEntityManager = commandContext.getExecutionEntityManager();// 根据当前任务的exection_id查找act_ru_execution中的执行子流记录(最后一条)(ACT_RU_EXECUTION.ID_=17)ExecutionEntity executionEntity = executionEntityManager.findById(taskEntity.getExecutionId());// 根据子执行流中的parent_id查找子执行实例对应的记录(ACT_RU_EXECUTION.ID_=15)ExecutionEntity parentExecutionEntity = executionEntityManager.findById(executionEntity.getParentId());// 根据子执行实例找到父执行流的记录(ACT_RU_EXECUTION.ID_=8)ExecutionEntity rootExecutionEntity = executionEntityManager.findById(parentExecutionEntity.getSuperExecutionId());// 删除相关的办理人(ID_=17 and ID_=15) ACT_RU_IDENTITYLINKIdentityLinkEntityManager identityLinkEntityManager = commandContext.getIdentityLinkEntityManager();identityLinkEntityManager.deleteIdentityLink(executionEntity, null, null, null);identityLinkEntityManager.deleteIdentityLink(parentExecutionEntity, null, null, null);// 删除子流程实例相关的变量(ID_=15) ACT_RU_VARIABLEVariableInstanceEntityManager variableInstanceEntityManager = commandContext.getVariableInstanceEntityManager();List<VariableInstanceEntity> variableInstancesEntityList = variableInstanceEntityManager.findVariableInstancesByExecutionId(parentExecutionEntity.getId());for (VariableInstanceEntity variableInstanceEntity : variableInstancesEntityList) {variableInstanceEntityManager.delete(variableInstanceEntity, true);}// 删除正在执行的tasktaskEntityManager.deleteTask(taskEntity, "删除子节点", true, true);// 删除子执行流executionEntityManager.deleteChildExecutions(parentExecutionEntity, "", true);// 删除子执行实例executionEntityManager.delete(parentExecutionEntity, true);// 将根执行流的当前活动id设置为目标任务FlowElement targetFlowElement = ProcessDefinitionUtil.getProcess(rootExecutionEntity.getProcessDefinitionId()).getFlowElement(targetTaskDefKey);rootExecutionEntity.setCurrentFlowElement(targetFlowElement);// 在根流程实例上继续流程commandContext.getAgenda().planContinueProcessInCompensation(rootExecutionEntity);return null;}public String getCurrentTaskId() {return currentTaskId;}public void setCurrentTaskId(String currentTaskId) {this.currentTaskId = currentTaskId;}public String getTargetTaskDefKey() {return targetTaskDefKey;}public void setTargetTaskDefKey(String targetTaskDefKey) {this.targetTaskDefKey = targetTaskDefKey;}
}
public void testSub2Parent() {// 从子流程中经理审批直接跳转到父流程中的发起申请节点String currentTaskId = "20";String targetTaskDefKey = "apply";Sub2ParentCommand sub2ParentCommand = new Sub2ParentCommand(currentTaskId, targetTaskDefKey);ProcessEngines.getDefaultProcessEngine().getManagementService().executeCommand(sub2ParentCommand);
}
三:执行过程分析
insert into ACT_HI_TASKINST ( ID_, PROC_DEF_ID_, PROC_INST_ID_, EXECUTION_ID_, NAME_, PARENT_TASK_ID_, DESCRIPTION_, OWNER_, ASSIGNEE_, START_TIME_, CLAIM_TIME_, END_TIME_, DURATION_, DELETE_REASON_, TASK_DEF_KEY_, FORM_KEY_, PRIORITY_, DUE_DATE_, CATEGORY_, TENANT_ID_ ) values
( '2502', 'LeaveProcess1:1:6', '7', '8', '发起申请', null, null, null, null, '2022-01-15 22:42:57.878', null, null, null, null, 'apply', null, 50, null, null, '' );insert into ACT_HI_ACTINST ( ID_, PROC_DEF_ID_, PROC_INST_ID_, EXECUTION_ID_, ACT_ID_, TASK_ID_, CALL_PROC_INST_ID_, ACT_NAME_, ACT_TYPE_, ASSIGNEE_, START_TIME_, END_TIME_, DURATION_, DELETE_REASON_, TENANT_ID_ ) values
( '2501', 'LeaveProcess1:1:6', '7', '8', 'apply', '2502', null, '发起申请', 'userTask', null, '2022-01-15 22:42:57.835', null, null, null, '' );insert into ACT_RU_TASK (ID_, REV_, NAME_, PARENT_TASK_ID_, DESCRIPTION_, PRIORITY_, CREATE_TIME_, OWNER_, ASSIGNEE_, DELEGATION_, EXECUTION_ID_, PROC_INST_ID_, PROC_DEF_ID_, TASK_DEF_KEY_, DUE_DATE_, CATEGORY_, SUSPENSION_STATE_, TENANT_ID_, FORM_KEY_, CLAIM_TIME_) values
('2502', 1, '发起申请', null, null, 50, '2022-01-15 22:42:57.835', null, null, null, '8', '7', 'LeaveProcess1:1:6', 'apply', null, null, 1, '', null, null );UPDATE ACT_RU_EXECUTION
SET REV_ = 2,BUSINESS_KEY_ = NULL,PROC_DEF_ID_ = 'LeaveProcess2:1:3',ACT_ID_ = 'pmApprove',IS_ACTIVE_ = FALSE,IS_CONCURRENT_ = FALSE,IS_SCOPE_ = FALSE,IS_EVENT_SCOPE_ = FALSE,IS_MI_ROOT_ = FALSE,PARENT_ID_ = '15',SUPER_EXEC_ = NULL,ROOT_PROC_INST_ID_ = '7',SUSPENSION_STATE_ = 1,NAME_ = NULL,IS_COUNT_ENABLED_ = FALSE,EVT_SUBSCR_COUNT_ = 0,TASK_COUNT_ = 0,JOB_COUNT_ = 0,TIMER_JOB_COUNT_ = 0,SUSP_JOB_COUNT_ = 0,DEADLETTER_JOB_COUNT_ = 0,VAR_COUNT_ = 0,ID_LINK_COUNT_ = 0
WHERE ID_ = '17' AND REV_ = 1;UPDATE ACT_RU_EXECUTION
SET REV_ = 3,BUSINESS_KEY_ = NULL,PROC_DEF_ID_ = 'LeaveProcess1:1:6',ACT_ID_ = 'apply',IS_ACTIVE_ = TRUE,IS_CONCURRENT_ = FALSE,IS_SCOPE_ = FALSE,IS_EVENT_SCOPE_ = FALSE,IS_MI_ROOT_ = FALSE,PARENT_ID_ = '7',SUPER_EXEC_ = NULL,ROOT_PROC_INST_ID_ = '7',SUSPENSION_STATE_ = 1,NAME_ = NULL,IS_COUNT_ENABLED_ = FALSE,EVT_SUBSCR_COUNT_ = 0,TASK_COUNT_ = 0,JOB_COUNT_ = 0,TIMER_JOB_COUNT_ = 0,SUSP_JOB_COUNT_ = 0,DEADLETTER_JOB_COUNT_ = 0,VAR_COUNT_ = 0,ID_LINK_COUNT_ = 0
WHERE ID_ = '8' AND REV_ = 2;UPDATE ACT_HI_ACTINST
SET EXECUTION_ID_ = '17',ASSIGNEE_ = NULL,END_TIME_ = '2022-01-15 22:42:19.358',DURATION_ = 18527666,DELETE_REASON_ = ''
WHERE ID_ = '19';delete FROM ACT_HI_COMMENT WHERE TASK_ID_ = '20';
delete FROM ACT_RU_VARIABLE WHERE ID_ = '16' and REV_ = 1;
delete FROM ACT_RU_TASK WHERE ID_ = '20' and REV_ = 1;
delete FROM ACT_RU_EXECUTION WHERE ID_ = '17' and REV_ = 2;
delete FROM ACT_RU_EXECUTION WHERE ID_ = '15' and REV_ = 1;
delete FROM ACT_HI_TASKINST WHERE ID_ = '20';
知识传送门 》》》》》》》》》》》》》》》》》
更多推荐
Activiti7工作流引擎:高阶篇(三) CallActivityTask 子流程跳转到父流程
发布评论