一、绘制流程
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); }