参考:链接: https://gitee.com/wwdui/activiti7-workflow.
链接: https://pan.baidu.com/s/1zi_7-7eGIYLP-hhG–fVqw.
提取码:nbdf
提要:
Activiti7集成的springboot中各个api已经可以通过ioc注入,类似
@Autowired
Private ProcessRuntime processRuntime;
通过这种形式引入api。
由于security和activiti7集成比较深入,所以每次运行方法前都要验证security。类似:
securityUtil.logInAs("bajie");
一.流程部署
repositoryService.createDeployment()
后面跟DeploymentBuilder中的方法:(必须的几个方法)
第一个方法:例如是上传的压缩文件就跟.addZipInputStream(zip),是普通文件就.addInputStream(fileName, fileInputStream)
第二个方法:name(“名字”)流程部署名称
第三个方法:deploy()流程部署
(直接通过bpmn.xml的string传入数据库)
Deployment deployment = repositoryService.createDeployment()
//此处命名 todo need xu
.addString("CreateWithBPMNJS.bpmn",stringBPMN)
.name("不知道在哪显示的部署名称")
.deploy();
(bpmn.xml会被加载到act_ge_bytearray表中的BYTES_字段中,使用navicat时用查询然后设置数据展示为网页)
部署后有改动的表:
1——act_ge_bytearray(记录流程部署信息)中的BYTES_中记录部署bpmn的xml文件。它是系统属性表,存储整个流程引擎级别的数据。
2——act_re_deployment(记录流程部署信息)
3——act_re_procdef(流程定义数据表)
二.启动流程实例
processRuntime.start(ProcessPayloadBuilder())
中的ProcessPayloadBuilder方法后面需要跟的几个方法:
.start()创建新的流程实例
.withProcessDefinitionKey(“流程定义主键”)
//.withVariable(“参数名”, 参数)
.withName(“流程定义名称”)
.withBusinessKey(“业务主键”)
.build()
关于.withVariable(“参数名”, 参数):参数名自定义,与代理人中的{assignee}),此写法用了uel表达式写法,意为动态写入代理人,当启动实例时可以.withVariable(“assignee”, “bajie”),这样注入代理人。
ProcessInstance processInstance = processRuntime.start(ProcessPayloadBuilder
.start()
.withProcessDefinitionKey(processDefinitionKey)
.withName(instanceName)
//.withVariable("content", instanceVariable)
//.withVariable("参数2", "参数2的值")
.withBusinessKey("自定义BusinessKey")
.build());
启动后有改动的表:
1——act_hi_actinst(历史节点表)
2——act_hi_identitylink(历史流程人员表)
3——act_hi_procinst(历史流程实例表)
4——act_hi_taskinst(历史流程任务表)
5——act_ru_execution(运行时流程执行实例表)
6——act_ru_identitylink(运行时流程人员表,存储任务节点与参与者相关信息)
7——act_ru_task(运行时任务节点表)
三.任务流转
获取任务:Page tasks = taskRuntime.tasks(Pageable.of(0, 100));
然后for (Task tk : tasks.getContent()) {任务处理}
办理任务:taskRuntime.complete(TaskPayloadBuilder.complete().withTaskId(taskId)
//.withVariable(“assignee”, bajie)//执行环节设置变量
.build());
其中(CompleteTaskPayloadBuilder)作为任务构建器
.withTaskId(“任务id”)根据任务id表明要操作的任务
taskRuntime.complete(TaskPayloadBuilder.complete().withTaskId(task.getId())
//.withVariable("num", "2")//执行环节设置变量
.build());
任务构造器中的withVariable是作为任务中除首节点外其余节点(首节点参看启动流程实例中的withVariable)的动态代理人配置设置为(${assignee} )时的任务流转,.
候选人、候选组时:
流转过程中使用候选人或者候选组时因为不是一个人审批,所以需要使用声明任务归属的操作,因为不知道谁来办理,需要先声明任务再办理。在任务被声明前所有候选人和候选组内成员都可以在自己的任务中查询到。可以把声明和办理写到一起。
任务拾取:taskRuntime.claim(TaskPayloadBuilder.claim().withTaskId(“任务id”).build());
其中taskRuntime.claim(声明任务构造器)。
声明任务构造器:ClaimTaskPayloadBuilder中的方法有.withTaskId(“任务id”)用来配置任务id,.withAssignee()设置代理人,build()构造。
声明完成后再执行任务办理即候选人、组模式正常流程。
taskRuntime.claim(TaskPayloadBuilder.claim().withTaskId(task.getId()).build());
任务归还与交办 :
taskService.setAssignee(“taskId”,“null”);//归还候选任务
归还:声明人变为空,所有候选人、组皆可重新发现该任务
taskService.setAssignee(“taskId”,“wukong”);//交办给wukong
交办:声明人变为别人,交给别人办理
流转时有改动的表:
1——act_hi_actinst(历史节点表)记录流转后的流转信息。
2——act_hi_detail(历史详情表,提供历史变量的查询,是在使用类似动态代理人之类的动态变量记录表)
3——act_hi_taskinst(历史流程任务表)
4——act_hi_varinst(历史变量表)
5——act_ru_execution(运行时流程执行实例表)
6——act_ru_task(运行时任务节点表)
7——act_ru_variable(运行时流程变量数据表)
四.挂起与激活
挂起
runtimeService.suspendProcessInstanceById(“73f0fb9a-ce5b-11ea-bf67-dcfb4875e032”);
System.out.println(“挂起流程实例”);
ProcessInstance processInstance = processRuntime.suspend(ProcessPayloadBuilder
.suspend()
.withProcessInstanceId(instanceID)
.build()
);
激活· runtimeService.activateProcessInstanceById(“73f0fb9a-ce5b-11ea-bf67-dcfb4875e032”);
System.out.println(“激活流程实例”);
ProcessInstance processInstance = processRuntime.resume(ProcessPayloadBuilder
.resume()
.withProcessInstanceId(instanceID)
.build()
);
关于参数:例如动态代理人代理人动态设置是启动实例时带的参数作为star后一个节点中的代理人参数,如图,启动实例时带入的参数是启动请假流程的代理人参数。
当流转启动请假流程时,带的参数是设置主管审批的代理人参数,每次都是启动前一个的时候设置后一个动态代理人。
操作附记:
代理人和候选人规则
如果有代理人,候选人就看不到任务
如果代理人将任务归还后才可以被候选人重新看到
如果候选人中没有刚才归还任务的代理人,那么代理人归还任务后也看不到任务
一个同时符合两个线规则的参数条件会两个任务都走,如果两个线规则对应两个用户任务那么就需要两个用户都通过才能结束流程。
委托人是当前受理人通过委托方法(delegateTask)将任务交给其他人,受理人就会变成委托人,其他人就会变成受理人。然后委托人不可以办理任务,受理人可以。
监听器
监听器是可以在任务开始或者到达任务节点的时候触发的事件。需要注意的是java类中要写明路径。
事件类型
create 任务创建后触发
Assignment 任务分配后触发
Delete 任务完成后触发
All 所有任务都触发
监听器 例子:
写完这个不怎么费劲,毕竟要想人前轻松,背后必下苦功。但是还是期待我的下一篇博客上线吧。