目录
流程定义设计
要求:用户职业如果是程序员,则必须经过内科,外科,还有附加检查都体检后,然后获取体检报告。
条件:userType表示用户职业
内科检查条件${userType == 0 || userType == 1}
外科检查条件${userType == 0 || userType == 1}
附件检查条件${userType ==1}
第一步:流程部署
public class GatawayTest {
//第一步:部署流程定义
@Test
public void processDeploy(){
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取部署服务
RepositoryService repositoryService = processEngine.getRepositoryService();
//流程定义部署服务
repositoryService.createDeployment().name("体检流程")
.activateProcessDefinitionsOn(new Date())
.addClasspathResource("exheathcheck.bpmn")
.addClasspathResource("exheathcheck.png").deploy();
}
}
第二步:流程启动
//第二步:流程实例化启动
@Test
public void processStart(){
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取运行服务服务
RuntimeService runtimeService = processEngine.getRuntimeService();
//流程定义部署服务
String businessKey = "1";
String processDefinitionKey = "heathprocess";
//流程定义激活即有效
RepositoryService repositoryService = processEngine.getRepositoryService();
repositoryService.activateProcessDefinitionByKey(processDefinitionKey);
HashMap<String,Object> variables = new HashMap<String,Object>();
variables.put("healthUser", "zhangsan");
variables.put("userType", 1);// 1表示程序员
variables.put("innerCheck", "lisi");
variables.put("outerCheck", "wangwu");
variables.put("extrCheck", "zhaoliu");
variables.put("reportUser", "tianqi");
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey, businessKey, variables);
System.out.println("流程定义id"+processInstance.getProcessDefinitionId());
System.out.println("流程定义名称"+processInstance.getProcessDefinitionName());
System.out.println("流程定实例id"+processInstance.getProcessInstanceId());
}
第三步:用户流程任务查询
//第三步:流程任务查询
@Test
public void processInstanceQuery(){
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//任务服务
TaskService taskService = processEngine.getTaskService();
//流程定义部署服务
String processDefinitionKey = "heathprocess";
String assignee = "zhangsan";
Task task = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).taskAssignee(assignee).singleResult();
if(task != null ){
System.out.println("任务id"+task.getId());
System.out.println("任务名称"+task.getName());
System.out.println("任务负责人"+task.getAssignee());
}
}
第四步:流程任务处理
//第四步:流程处理
@Test
public void processInstanceHandler(){
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//任务服务
TaskService taskService = processEngine.getTaskService();
//流程定义部署服务
String processDefinitionKey = "heathprocess";
String assignee = "zhangsan";
Task task = taskService.createTaskQuery().processDefinitionKey(processDefinitionKey).taskAssignee(assignee).singleResult();
if(task != null ){
taskService.complete(task.getId());
}
}
重点观察流程进入包含网关后的变化
执行到这里流程实例已经进入网关通过判断再次观察act_ru_task,此时同时出现三条任务
第五步:执行内科检查流程环节
//第五步:流程处理
@Test
public void processInstanceHandler(){
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//任务服务
TaskService taskService = processEngine.getTaskService();
//流程定义部署服务
String processInstanceId = "2501";
String assignee = "lisi";
Task task = taskService.createTaskQuery().processInstanceId(processInstanceId).taskAssignee(assignee).singleResult();
if(task != null ){
taskService.complete(task.getId());
}
}
注:第四步种存在一个问题就是使用流程定义的String processDefinitionKey = "heathprocess"这样设置
流程定义实例化多个时候采用这样查询不合适,同一个流程定义实例化多次流程定义的processDefinitionKey肯定是一样的,无法区分执行的是哪个流程的实例化,因此这里采用流程实例化processInstanceId
执行完后查看act_ru_task,该流程实例的任务变成两条
第六步:执行外科检查流程环节
@Test
public void processInstanceHandler(){
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//任务服务
TaskService taskService = processEngine.getTaskService();
//流程定义部署服务
String processInstanceId = "2501";
String assignee = "wangwu";
Task task = taskService.createTaskQuery().processInstanceId(processInstanceId).taskAssignee(assignee).singleResult();
if(task != null ){
taskService.complete(task.getId());
}
}
执行完后查看act_hi_actinst
act_ru_execution
第七步:执行附加检查流程环节
@Test
public void processInstanceHandler(){
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//任务服务
TaskService taskService = processEngine.getTaskService();
//流程定义部署服务
String processInstanceId = "2501";
String assignee = "zhaoliu";
Task task = taskService.createTaskQuery().processInstanceId(processInstanceId).taskAssignee(assignee).singleResult();
if(task != null ){
taskService.complete(task.getId());
}
}
注意:第五步,第六步,第七步是并行执行的任务,互不影响,这也是包含网关的特点。
第八步:执行获取流程报告环节
@Test
public void processInstanceHandler(){
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//任务服务
TaskService taskService = processEngine.getTaskService();
//流程定义部署服务
String processInstanceId = "2501";
String assignee = "tianqi";
Task task = taskService.createTaskQuery().processInstanceId(processInstanceId).taskAssignee(assignee).singleResult();
if(task != null ){
taskService.complete(task.getId());
}
}
此时该实例流程已经执行完成!!
总结:包含网关
1.相当于并行网关和拍它网关的结合体。
2.流程实例经过包含网关后,流程任务并行执行,并行任务执行互不影响。
3.包含网关可以添加条件并按条件执行,而在并行网关中添加条件会被自动忽略。
4.一个流程实例执行完后,该流程实例在act_ru_*的表中记录都会删除(act_ru_*表只记录运行中的流程实例。