二、流程定义细讲
管理流程定义主要涉及到以下的4张表:
-- 流程部署相关的表 SELECT * FROM act_ge_bytearray # 通用字节资源表 SELECT * FROM act_ge_property # 通用属性表,可以生成部署id SELECT * FROM act_re_deployment #部署表 SELECT * FROM act_re_procdef # 流程定义表
2.1PNG资源
在Eclipse中Activiti插件会自动生成一个BPMN与之对应的PNG图片,是需要通过加载PNG图片的
@Test public void deploy() { //获取仓库服务 :管理流程定义 RepositoryService repositoryService = processEngine.getRepositoryService(); Deployment deploy = repositoryService.createDeployment()//创建一个部署的构建器 .addClasspathResource("LeaveActiviti.bpmn")//从类路径中添加资源,一次只能添加一个资源 .name("请求单流程")//设置部署的名称 .category("办公类别")//设置部署的类别 .deploy(); System.out.println("部署的id"+deploy.getId()); System.out.println("部署的名称"+deploy.getName()); }
而我们的Intellij idea插件不会自动生成PNG图片,但是我们在加载BPMN文件的时候,好像会自动插入PNG图片,数据库是有对应的记录的【我们是没有手动加载PNG图片资源的】
这里写图片描述
我们查看一下
//查看bpmn 资源图片 @Test public void viewImage() throws Exception{ String deploymentId="201"; String imageName=null; //取得某个部署的资源的名称 deploymentId List<String> resourceNames = processEngine.getRepositoryService().getDeploymentResourceNames(deploymentId); // buybill.bpmn buybill.png if(resourceNames!=null&&resourceNames.size()>0){ for(String temp :resourceNames){ if(temp.indexOf(".png")>0){ imageName=temp; } } } /** * 读取资源 * deploymentId:部署的id * resourceName:资源的文件名 */ InputStream resourceAsStream = processEngine.getRepositoryService() .getResourceAsStream(deploymentId, imageName); //把文件输入流写入到文件中 File file=new File("d:/"+imageName); FileUtils.copyInputStreamToFile(resourceAsStream, file); }
可惜的是,查看出来的图片的中文数据会乱码…
这里写图片描述
2.2查看流程定义
我们当时候查询流程定义是通过我们设置流程图的id来查看的….其实我们可以通过其他的属性来查询…并且可以查询出更加详细的数据
//查看流程定义 @Test public void queryProcessDefination(){ String processDefiKey="buyBill";//流程定义key //获取流程定义列表 List<ProcessDefinition> list = processEngine.getRepositoryService().createProcessDefinitionQuery() //查询 ,好比where // .processDefinitionId(proDefiId) //流程定义id // 流程定义id : buyBill:2:704 组成 : proDefikey(流程定义key)+version(版本)+自动生成id .processDefinitionKey(processDefiKey)//流程定义key 由bpmn 的 process 的 id属性决定 // .processDefinitionName(name)//流程定义名称 由bpmn 的 process 的 name属性决定 // .processDefinitionVersion(version)//流程定义的版本 .latestVersion()//最新版本 //排序 .orderByProcessDefinitionVersion().desc()//按版本的降序排序 //结果 // .count()//统计结果 // .listPage(arg0, arg1)//分页查询 .list(); //遍历结果 if(list!=null&&list.size()>0){ for(ProcessDefinition temp:list){ System.out.print("流程定义的id: "+temp.getId()); System.out.print("流程定义的key: "+temp.getKey()); System.out.print("流程定义的版本: "+temp.getVersion()); System.out.print("流程定义部署的id: "+temp.getDeploymentId()); System.out.println("流程定义的名称: "+temp.getName()); } } }
2.3资源来自ZIP
我们还可以加载的是ZIP类型的资源数据
//部署流程定义,资源来自zip格式 @Test public void deployProcessDefiByZip(){ InputStream in=getClass().getClassLoader().getResourceAsStream("BuyBill.zip"); Deployment deploy = processEngine.getRepositoryService() .createDeployment() .name("采购流程") .addZipInputStream(new ZipInputStream(in)) .deploy(); System.out.println("部署名称:"+deploy.getName()); System.out.println("部署id:"+deploy.getId()); }
2.4删除流程定义
//删除流程定义 @Test public void deleteProcessDefi(){ //通过部署id来删除流程定义 String deploymentId="101"; processEngine.getRepositoryService().deleteDeployment(deploymentId); }
再次查询的时候,已经没有101这个流程定义的数据了。
这里写图片描述
三、流程实例与任务执行细讲
流程实例与任务执行的常用表有以下几个:
-- 流程实例与任务 SELECT * FROM act_ru_execution # 流程执行对象信息 SELECT * FROM act_ru_task # 正在运行的任务表 SELECT * FROM act_hi_procinst # 历史流程实例表 SELECT * FROM act_hi_taskinst # 历史流程任务表
这里就简单简述一下流程实例与流程对象的区别:
- (1)如果是单例流程,执行对象ID就是流程实例ID
- (2)如果一个流程有分支和聚合,那么执行对象ID和流程实例ID就不相同
- (3)一个流程中,流程实例只有1个,执行对象可以存在多个。
3.1开始流程
@Test public void startProcess(){ String processDefiKey="leaveActiviti";//bpmn 的 process id属性 ProcessInstance pi = processEngine.getRuntimeService() .startProcessInstanceByKey(processDefiKey); System.out.println("流程执行对象的id:"+pi.getId());//Execution 对象 System.out.println("流程实例的id:"+pi.getProcessInstanceId());//ProcessInstance 对象 System.out.println("流程定义的id:"+pi.getProcessDefinitionId());//默认执行的是最新版本的流程定义 }
3.2查看正在运行的任务
//查询正在运行任务 @Test public void queryTask(){ //取得任务服务 TaskService taskService = processEngine.getTaskService(); //创建一个任务查询对象 TaskQuery taskQuery = taskService.createTaskQuery(); //办理人的任务列表 List<Task> list = taskQuery.list(); //遍历任务列表 if(list!=null&&list.size()>0){ for(Task task:list){ System.out.println("任务的办理人:"+task.getAssignee()); System.out.println("任务的id:"+task.getId()); System.out.println("任务的名称:"+task.getName()); } } }
查询SELECT * FROM act_ru_task 表
这里写图片描述这里写图片描述