1. Activiti流程操作
1.1 流程的部署
将上面在设计器中定义的流程部署到activiti数据库中,就是我们讲的流程部署。
通过调用Activiti的api将流程定义的bpmn和png两个文件一个一个添加部署到activiti中,还可以将两个文件打车zip包部署。
1.1.1 单个文件部署
分别将bpmn文件和png图片分别部署
/** * 实现文件的单个部署 */ @Test public void test03(){ // 1.获取ProcessEngine对象 ProcessEngine engine = ProcessEngines.getDefaultProcessEngine(); // 2.获取RepositoryService进行部署操作 RepositoryService service = engine.getRepositoryService(); // 3.使用RepositoryService进行部署操作 Deployment deploy = service.createDeployment() .addClasspathResource("bpmn/evection.bpmn") // 添加bpmn资源 .addClasspathResource("bpmn/evection.png") // 添加png资源 .name("出差申请流程") .deploy();// 部署流程 // 4.输出流程部署的信息 System.out.println("流程部署的id:" + deploy.getId()); System.out.println("流程部署的名称:" + deploy.getName()); } 复制代码
日志中查看到相关的输出信息
1.1.2 部署zip文件
将bpmn文件和png文件两个打包为一个zip文件,统一上传
/** * 通过一个zip文件来部署操作 */ @Test public void test04(){ // 定义zip文件的输入流 InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("bpmn/evection.zip"); // 对 inputStream 做装饰 ZipInputStream zipInputStream = new ZipInputStream(inputStream); ProcessEngine engine = ProcessEngines.getDefaultProcessEngine(); RepositoryService repositoryService = engine.getRepositoryService(); Deployment deploy = repositoryService.createDeployment() .addZipInputStream(zipInputStream) .name("出差申请流程") .deploy(); // 4.输出流程部署的信息 System.out.println("流程部署的id:" + deploy.getId()); System.out.println("流程部署的名称:" + deploy.getName()); } 复制代码
上传后的数据库中的数据和单个文件上传其实是一样的。
1.1.3 操作数据表
流程定义部署后操作activiti中的三张表
act_re_deployment: 流程定义部署表,每部署一次就增加一条记录
act_re_procdef :流程定义表,部署每个新的流程定义都会在这张表中增加一条记录
act_ge_bytearray :流程资源表,流程部署的 bpmn文件和png图片会保存在该表中
1.2 启动流程实例
流程定义部署在Activiti后就可以通过工作流管理业务流程,也就是说上边部署的出差申请流程可以使用了。
针对该流程,启动一个流程表示发起一个新的出差申请单,这就相当于Java类和Java对象的关系,类定义好了后需要new创建一个对象使用,当然可以new出多个对象来,对于出差申请流程,张三可以发起一个出差申请单需要启动一个流程实例。
/** * 启动一个流程实例 */ @Test public void test05(){ // 1.创建ProcessEngine对象 ProcessEngine engine = ProcessEngines.getDefaultProcessEngine(); // 2.获取RuntimeService对象 RuntimeService runtimeService = engine.getRuntimeService(); // 3.根据流程定义的id启动流程 String id= "evection"; ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(id); // 4.输出相关的流程实例信息 System.out.println("流程定义的ID:" + processInstance.getProcessDefinitionId()); System.out.println("流程实例的ID:" + processInstance.getId()); System.out.println("当前活动的ID:" + processInstance.getActivityId()); } 复制代码
输出内容:
启动流程实例涉及到的表结构
act_hi_actinst 流程实例执行历史
act_hi_identitylink 流程的参与用户的历史信息
act_hi_procinst 流程实例历史信息
act_hi_taskinst 流程任务历史信息
act_ru_execution 流程执行信息
act_ru_identitylink 流程的参与用户信息
act_ru_task 任务信息
1.3 任务查找
流程启动后,任务的负责人就可以查询自己当前能够处理的任务了,查询出来的任务都是当前用户的待办任务
/** * 任务查询 */ @Test public void test06(){ String assignee ="zhansan"; ProcessEngine engine = ProcessEngines.getDefaultProcessEngine(); // 任务查询 需要获取一个 TaskService 对象 TaskService taskService = engine.getTaskService(); // 根据流程的key和任务负责人 查询任务 List<Task> list = taskService.createTaskQuery() .processDefinitionKey("evection") .taskAssignee(assignee) .list(); // 输出当前用户具有的任务 for (Task task : list) { System.out.println("流程实例id:" + task.getProcessInstanceId()); System.out.println("任务id:" + task.getId()); System.out.println("任务负责人:" + task.getAssignee()); System.out.println("任务名称:" + task.getName()); } } 复制代码
输出结果