一、绘制流程
1、指定流程定义key值;
流程定义key值是流程定义的标识,建议:相同的业务流程,流程定义的key名字定义一样,比如,如果需要创建新的业务流程,请假流程则使用新的key。
2、指定任务负责人
二、部署流程定义
//部署流程定义
@Test
public void deployProcess(){
//获取repositoryService
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
Deployment deployment = repositoryService
.createDeployment().addClasspathResource("bpmn/example.bpmn")
.addClasspathResource("bpmn/example.png") //通过bpmn文件生成的png文件
.name("test").deploy();
System.out.println("测试结果:"+deployment.getId()+"=="+deployment.getName());
}
//压缩包部署方式
@Test
public void deployProcessByZip(){
//创建processEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取repositoryService
RepositoryService repositoryService = processEngine.getRepositoryService();
//定义输入流
InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("bpmn/example.zip");
ZipInputStream zipInputStream = new ZipInputStream(inputStream);
Deployment deployment = repositoryService.createDeployment().addZipInputStream(zipInputStream).deploy();
System.out.println("测试流程部署ID=="+deployment.getId());
System.out.println("测试流程部署NAME=="+deployment.getName());
}
流程定义部署后操作activiti数据表如下:
SELECT * FROM act_re_deployment #流程定义部署表,记录流程部署信息
SELECT * FROM act_re_procdef #流程定义表,记录流程定义信息
SELECT * FROM act_ge_bytearray #资源表
说明:
act_re_deployment和act_re_procdef一对多关系,一次部署在流程部署表生成一条记录,但一次部署可以部署多个流程定义,每个流程定义在流程定义表生成一条记录。
每一个流程定义在act_ge_bytearray 会存在两个资源记录,bpmn和png。
建议:一次部署一个流程,这样部署表和流程定义表是一对一有关系,方便读取流程部署及流程定义信息。
三、查看部署的流程定义
//查看部署的流程定义
@Test
public void queryProcessDefinition(){
//创建processEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取repositoryService
RepositoryService repositoryService = processEngine.getRepositoryService();
ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();
//流程定义KEY
String key = "example";
List<ProcessDefinition> processDefinitionList =
processDefinitionQuery.processDefinitionKey(key).orderByProcessDefinitionVersion().desc().list();
for(ProcessDefinition processDefinition : processDefinitionList){
System.out.println("流程定义ID=="+processDefinition.getId());
System.out.println("流程定义NAME=="+processDefinition.getName());
System.out.println("流程定义部署ID=="+processDefinition.getDeploymentId());
}
}
四、删除部署成功的流程定义
//删除部署成功的流程定义
@Test
public void deleteProcessDefinition(){
//创建processEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取repositoryService
RepositoryService repositoryService = processEngine.getRepositoryService();
//流程定义部署ID
String deploymentId = "7501";
//删除流程定义,如果该流程定义已有流程实例启动则删除时出错
repositoryService.deleteDeployment(deploymentId);
//设置true 级联删除流程定义,即使该流程有流程实例启动也可以删除,设置为false非级别删除方式
//repositoryService.deleteDeployment(deploymentId , true);
}
1) 使用repositoryService删除流程定义
2) 如果该流程定义下没有正在运行的流程,则可以用普通删除。
3) 如果该流程定义下存在已经运行的流程,使用普通删除报错,可用级联删除方法将流程及相关记录全部删除。项目开发中使用级联删除的情况比较多,删除操作一般只开放给超级管理员使用。
五、启动一个流程实例
//启动一个流程实例
@Test
public void startProcessInstance(){
//创建processEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取runtimeService
RuntimeService runtimeService = processEngine.getRuntimeService();
//根据流程定义KEY启动流程
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("example");
System.out.println("流程定义ID=="+processInstance.getProcessDefinitionId());
System.out.println("流程实例ID=="+processInstance.getId());
System.out.println("流程定义NAME=="+processInstance.getName());
}
六、查询当前人待执行的任务
//查询当前人待执行的任务
@Test
public void findPersonalTaskList(){
//创建processEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取taskService
TaskService taskService = processEngine.getTaskService();
//获取当前人待执行任务列表
List<Task> taskList = taskService.createTaskQuery().taskAssignee("park").list();
for(Task task : taskList){
System.out.println("测试任务ID=="+task.getId());
System.out.println("测试任务NAME=="+task.getName());
System.out.println("测试流程实例IDE=="+task.getProcessInstanceId());
}
//当前人只有单个任务时使用
Task task = taskService.createTaskQuery().taskAssignee("park").singleResult();
System.out.println("测试任务ID=="+task.getId());
System.out.println("测试任务NAME=="+task.getName());
System.out.println("测试流程实例IDE=="+task.getProcessInstanceId());
}
七、完成任务
//完成任务
@Test
public void completTask(){
//创建processEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//获取taskService
TaskService taskService = processEngine.getTaskService();
//完成任务
String taskId = "12";
taskService.complete(taskId);
}