一个请假流程:
先画一个流程图,打开IDEA(已经安装Activiti Designer 流程设计器),在resources下新建文件夹diagram,在diagram下新建一个holiday.pbmn,画板中包括以下结点:
Connection—连接
Event---事件
Task---任务
Gateway---网关
Container—容器
Boundary event—边界事件
Intermediate event- -中间事件
画好如下图:
然后将该图另存为png图片,具体操作:先复制holiday.pbmn为holiday.xml文件,然后右击holiday.xml,
选择Diagrams,再选择Show BPMN 2.0 Designer,最后选择Export to file
下面写代码开始使用流程:
package com.lxm.activiti;
import org.activiti.engine.*;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipInputStream;
public class ActivitiDeployment {
public static void main(String[] args){
//1.创建ProcessEngineConfiguration对象 第一个参数:配置文件名称 第二个参数是配置文件processEngineConfiguration的bean的id
ProcessEngineConfiguration configuration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml","processEngineConfiguration");
//创建ProcesEngine对象
ProcessEngine processEngine = configuration.buildProcessEngine();
//流程部署
//processDeployment(processEngine);
//启动一个流程实例
//startProcess(processEngine);
//任务查询
//List list=searchTask(processEngine);
//处理任务
//disposeTask(processEngine,list);
}
//流程部署
public static void processDeployment(ProcessEngine processEngine){
//部署流程定义就是要将上边绘制的图形即流程定义(.bpmn)部署在工作流程引擎 activiti 中
//2.得到RepositoryService实例
RepositoryService repositoryService = processEngine.getRepositoryService();
//3.进行部署
Deployment deployment=repositoryService.createDeployment()
.addClasspathResource("diagram/holiday.bpmn")
.addClasspathResource("diagram/holiday.png")
.name("请假申请流程")
.deploy();
//执行此操作后 activiti 会将上边代码中指定的 bpm 文件和图片文件保存在 activiti 数据库。
// 受影响的表有:
// act_re_deployment 部署信息
// act_re_procdef 流程定义的一些信息
// act_ge_bytearray 流程定义的bpmn文件及png文件
//4.输出部署的一些信息
System.out.println(deployment.getName());
System.out.println(deployment.getId());
}
//流程部署压缩包方式,把holiday.bpmn和holiday.png打包成holiday.zip
public static void processDeploymentByZip(ProcessEngine processEngine){
InputStream inputStream=ActivitiDeployment.class.getClassLoader().getResourceAsStream("diagram/holiday.zip");
ZipInputStream zipInputStream=new ZipInputStream(inputStream);
//2.得到RepositoryService实例
RepositoryService repositoryService = processEngine.getRepositoryService();
//3.进行部署
Deployment deployment=repositoryService.createDeployment()
.addZipInputStream(zipInputStream)
.name("请假申请流程")
.deploy();
//执行此操作后 activiti 会将上边代码中指定的 bpm 文件和图片文件保存在 activiti 数据库。
}
//启动一个流程实例
public static void startProcess(ProcessEngine processEngine){
//流程定义部署在 activiti 后就可以通过工作流管理业务流程了,也就是说上边部署的请假申请流程可以使用了。
//针对该流程,启动一个流程表示发起一个新的请假申请单,这就相当于 java 类与 java 对象的关系,类定义好后需要 new 创建一个对象使用,当然可以 new 多个对象
RuntimeService runtimeService=processEngine.getRuntimeService();
ProcessInstance processInstance=runtimeService.startProcessInstanceByKey("myProcess_1");
System.out.println(processInstance.getDeploymentId());
System.out.println(processInstance.getDescription());
System.out.println(processInstance.getName());
System.out.println(processInstance.getProcessInstanceId());
System.out.println(processInstance.getId());
}
//任务查询
public static List<String> searchTask(ProcessEngine processEngine){
//流程启动后,各各任务的负责人就可以查询自己当前需要处理的任务,查询出来的任务都是该用户的待办任务。
TaskService taskService=processEngine.getTaskService();
List<Task> list=taskService.createTaskQuery()
.processDefinitionKey("myProcess_1")//流程实例key
//.taskAssignee("")//查询谁的任务
.list();
List<String> idList=new ArrayList<String>();
for(Task task:list){
idList.add(task.getId());
System.out.println(task.getId());
System.out.println(task.getName());
System.out.println(task.getProcessInstanceId());
}
return idList;
}
//处理任务
public static void disposeTask(ProcessEngine processEngine,List<String> list){
//任务负责人查询待办任务,选择任务进行处理,完成任务。
TaskService taskService=processEngine.getTaskService();
for(String id:list){
taskService.complete(id);//任务id
System.out.println("处理任务id:"+id);
}
}
}