流程实例操作
-
插件安装
idea低版本安装actiBPM亦可
-
安装重启后,在resource静态资源文件夹下创建processes文件夹
-
右击processes文件夹新建bpmn文件
-
显示xml文件
-
2xml文件右击选择创建bpmn.xml文件
-
创建开始事件
-
点击开始事件设置id和name
-
接下来右击创建user task 设置id,name及用户名
-
最后创建结束事件 设置id和name
-
右击保存图片,存入processes下并取名
此时processes下会多一个png样式的图片,就是流程图
注意xml和png格式:
-
png:xxx.png
-
xml:xxxx.bpmn20.xml
-
通过bpmn和png文件部署流程定义
/**
* 部署流程定义
* 部署流程:
* 1. act_re_procdef 生成流程定义信息表(id值组成:流程定义唯一表示key:版本号:随机标识值.)
* 2. act_re_deployment 流程部署信息表,每执行一次部署,会插入一条记录
* 3. act_ge_bytearray 流程资源表,插入资源数据,当前插入两条记录(.bpmn和.png资源)
* 其中 act_re_deployment 与 act_re_procdef 表是一对多的关系,
* act_re_procdef 每条记录对应一个流程的定义信息
* 每次部署,针对相同的流程定义key,对应的version会自增1
*/
@Test
public void deplayByFile(){
//1,获取流程引擎实例
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//2,获取部署流程定义的service
RepositoryService repositoryService = processEngine.getRepositoryService();
//3,调用相关api方法进行部署
Deployment deployment = repositoryService.createDeployment()
.name("请假申请流程")
.addClasspathResource("processes/leave.bpmn20.xml")
.addClasspathResource("processes/leave.png")
.deploy();
//4,部署输出结果
System.out.println(deployment.getId());
System.out.println(deployment.getName());
}
此时,act_re_procdef,act_re_deployment,act_ge_bytearray三张表里面会添加相应的数据
zip 流程定义压缩包部署
将 leave.bpmn20.xml和 leave.png 压缩成 leave.zip ,放在类路径下的 processes/leave.zip
运行代码:
/**
* 通过zip压缩包部署流程定义
*/
@Test
public void deplayByZip(){
//1,获取流程引擎实例
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//2,获取部署流程定义的service
RepositoryService repositoryService = processEngine.getRepositoryService();
//3,部署流程定义
//读取zip资源压缩包,转成输入流
InputStream is = ReflectUtil.getResourceAsStream("processes/leave.zip");
ZipInputStream zipInputStream = new ZipInputStream(is);
Deployment deployment = repositoryService.createDeployment()
.addZipInputStream(zipInputStream)
.name("请假申请流程压缩包")
.deploy();
//4,部署输出结果
System.out.println(deployment.getId());
System.out.println(deployment.getName());
}
运行结果
注意,此时数据库里面的key里面的值应与流程定义key对应
相同流程这边version是依次叠加的
查询部署好的流程定义数据
/**
* 查询部署好的流程定义数据
*/
@Test
public void getProcessDefinitionList() {
//1,获取流程引擎实例
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//2,获取部署流程定义的service
RepositoryService repositoryService = processEngine.getRepositoryService();
//3,获取流程定义查询对象
ProcessDefinitionQuery query = repositoryService.createProcessDefinitionQuery();
List<ProcessDefinition> processDefinitions = query.processDefinitionKey("leave")
.orderByProcessDefinitionVersion()
.desc()
.list();
for (ProcessDefinition pd : processDefinitions) {
System.out.print("流程部署id:" + pd.getDeploymentId());
System.out.print(", 流程定义id:" + pd.getId());
System.out.print(", 流程定义key:" + pd.getKey());
System.out.print(", 流程定义名称:" + pd.getName());
System.out.println(", 流程版本号:" + pd.getVersion());
}
}
启动流程实例
流程定义部署后,然后可以通过 activiti 工作流管理业务流程了。例如上一篇部署好了请假流程,可以申请请假了。
针对部署好的流程定义,每次用户发起一个新的请假申请,就对应的启动一个新的请假流程实例;
类似于 java 类与 java 对象(实例)的关系,定义好类后,使用 new 创建一个对象(实例)使用,当然可以 new 多个对象(实例)。
/**
* 开启一个流程实例(提交申请) 开启流程需要使用以下7张表
* act_hi_taskinst:流程实例的历史任务信息
* act_hi_procinst:流程实例的历史表
* act_hi_actinst:流程实例节点历史信息
* act_hi_identitylink:流程实例的参与者历史信息
* act_ru_execution:流程实例运行中执行的信息
* act_ru_task:流程实例运行中的(节点)任务信息
* act_ru_identitylink:流程实例运行中的参与者信息
*/
@Test
public void startProcessInstance() {
//1,获取流程引擎实例
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//2,获取RuntimeService服务实例
RuntimeService runtimeService = processEngine.getRuntimeService();
//3,开启流程实例 (流程定义key,每次启动都会查找最新的版本)
//通过流程定义key启动的流程实例,我们是最新版本的流程定义数据
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("leave");
System.out.println("流程定义id:" + processInstance.getProcessDefinitionId());
System.out.println("流程实例id:" + processInstance.getId());
}
注释里对应的数据库表里会添加相应的记录
当前开启的流程也是最新版本的流程
查询办理人的待办任务(注释部分可查询多个待办任务,但钱只有一条任务的情况下,可返回一条),将待办任务进行完成。
/**
* 查询办理人的待办任务
*/
@Test
public void taskListByAssignee() {
//1,获取流程引擎实例
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//2,获取taskService
TaskService taskService = processEngine.getTaskService();
/* //3,查询待办任务
List<Task> list = taskService.createTaskQuery()
.processDefinitionKey("leave")
.taskAssignee("wsy1")
.list();
for (Task task : list) {
System.out.println("流程实例id: " + task.getProcessInstanceId());
System.out.println("任务id: " + task.getId());
System.out.println("(节点)任务名称: " + task.getName());
System.out.println("任务办理人: " + task.getAssignee());
}*/
//3,当前只有一条任务,则仅返回一条
Task task = taskService.createTaskQuery()
.taskAssignee("wsy1")
.singleResult();
//4,完成任务
if(task != null) {
taskService.complete(task.getId());
System.out.println("完成任务");
} else {
System.out.println("查询结果为空");
}
}
返回结果
此时,当前流程审批任务完成,进行下一审批或者审批完成
当前wsy1的任务结束,act_ru_task表里面会记录下一个任务节点
act_ru_identitylink表显示当前流程任务参与者有两个人
更多表记录信息可在下列表中查询
开启一个流程实例(提交申请) 开启流程需要使用以下7张表
act_hi_taskinst:流程实例的历史任务信息
act_hi_procinst:流程实例的历史表
act_hi_actinst:流程实例节点历史信息
act_hi_identitylink:流程实例的参与者历史信息
act_ru_execution:流程实例运行中执行的信息
act_ru_task:流程实例运行中的(节点)任务信息
act_ru_identitylink:流程实例运行中的参与者信息
当任务节点完成后,act_ru_task表,act_ru_execution表和act_hi_identitylink记录会清空,节约资源,提高效率;历史表会记录对应信息;
最后,我们可以查询流程办理历史信息,通过 HistoryService 历史数据对象来获取 HistoricActivityInstanceQuery 历史节点查询对象
/**
* 查询流程实例的办理历史节点信息
*/
@Test
public void historyInfo() {
//1,获取流程引擎实例
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//2,历史相关的service
HistoryService historyService = processEngine.getHistoryService();
//3,获取查询对象
HistoricActivityInstanceQuery query = historyService.createHistoricActivityInstanceQuery();
//4,开始查询 流程实例id
List<HistoricActivityInstance> list = query.processInstanceId("5001")
.orderByHistoricActivityInstanceStartTime()
.asc()
.list();
for (HistoricActivityInstance hi : list) {
System.out.println("流程定义id: " + hi.getProcessDefinitionId());
System.out.println("流程实例id: " + hi.getProcessInstanceId());
System.out.println("(节点)任务id: " + hi.getActivityId());
System.out.println("节点名称: " + hi.getActivityName());
System.out.println("任务办理人: " + hi.getAssignee());
}
}
流程定义id: leave:2:2504
流程实例id: 5001
(节点)任务id: start
节点名称: 开始
任务办理人: null
流程定义id: leave:2:2504
流程实例id: 5001
(节点)任务id: process1
节点名称: 经理审批
任务办理人: wsy1
流程定义id: leave:2:2504
流程实例id: 5001
(节点)任务id: process2
节点名称: 总监审批
任务办理人: wsy2
流程定义id: leave:2:2504
流程实例id: 5001
(节点)任务id: sid-29f8b024-d3ba-4573-8b2a-79ca6587c7fe
节点名称: null
任务办理人: null