activiti 工作流引擎 - 接口实战运用
1、依据简单的 开始–>申请–>审批–>结束 流程步骤解析接口方法。
该流程图使用eclipse的activiti插件所画,插件安装步骤:https://blog.csdn.net/wangshao5122/article/details/100920422
申请操作指定操作人为:admin
审批则使用动态变量后期设定审批人: ${username}
2、启动流程
在启动流程时,设置动态审批人的变量值。
//流程图id
String id = "rocess";
//启动流程,并设定审批人为admin1
Map<String, Object> variables = new HashMap<>();
variables.put("username", "admin1");
ProcessInstance pi= runtimeService.startProcessInstanceByKey("rocess", variables);
或者 审批人未设定为动态变量,可直接启动流程。
//流程图id
String id = "rocess";
//启动,生成流程实例
ProcessInstance pi = runtimeService.startProcessInstanceByKey(id);
3、请假申请
//存放请假内容(可自定义变量名称和内容)
Map<String, Object> args = new HashMap<>();
args.put("applyUser", user.getUsername()); //请假申请人
args.put("applyName", name); //请假原因
args.put("applyDate", date); //请假天数
//流程实例启动后,流程会自动跳转到请假申请节点
Task task= taskService.createTaskQuery().processInstanceId(pi.getId()).singleResult();
//设置请假申请任务的执行人,当前用户:admin
taskService.setAssignee( task.getId(),"admin");
//完成请假申请任务
taskService.complete( task.getId(), args);
或者 可不填写请假内容、不设置申请执行人(因为流程图中已设定操作人为admin,以上代码重新设定是担心此申请任务非admin所发起)
//流程实例启动后,流程会自动跳转到请假申请节点
Task task= taskService.createTaskQuery().processInstanceId(pi.getId()).singleResult();
//完成请假申请任务
taskService.complete( task.getId(), args);
注:未完成任务对应数据库表:act_ru_task
4、审批
//填写审批意见,这里设定为:同意
boolean result = true;
Map<String, Object> args = new HashMap<>();
args.put("auditUser", user.getUsername()); //审批人
args.put("auditName", result?"同意":"不同意"); //审批意见
activiti.task(pi,user.getUsername(),args);
//流程实例启动后,流程会自动跳转到审批节点
Task task1= taskService.createTaskQuery().processInstanceId(pi.getId()).singleResult();
//设置审批任务的执行人,当前用户:admin1
taskService.setAssignee(task1.getId(), "admin1");
//完成审批任务
taskService.complete(task1.getId(), args);
或者 可不填写审批意见、不设置审批执行人(因为启动流程时已设定操作人为admin1)
//流程实例启动后,流程会自动跳转到审批节点
Task task= taskService.createTaskQuery().processInstanceId(pi.getId()).singleResult();
//完成审批任务
taskService.complete( task.getId(), args);
发现
此时你应该发现:如果只是简单的申请和审批的话,代码是相同的。他们所不同的是根据pi.getId()所获得的流程进度的不同,而导致task任务对象不同
5、获取该用户所需要执行的任务
//根据流程id和用户名称获取未完成的用户任务
String id = "rocess";
String name="admin";
//.taskAssignee(name)方法的调用-->去除,将获取该流程图所有未完成的任务,
//.orderByTaskCreateTime().desc()该方法是将任务集按照任务的创建时间进行倒序。
List<Task> resultTask = taskService.createTaskQuery().processDefinitionKey(id).taskAssignee(name).orderByTaskCreateTime().desc().list();
//查询该任务的任务信息(上边方法中所填写的内容如:请假原因和审批意见)
for(Task task:resultTask ){
Map<String, VariableInstance> vars = taskService.getVariableInstances(task.getId()); //获取任务信息
for(String key : vars.keySet()){
if("applyName".equals(key)){
vars.get(key).getTextValue(); //请假原因
}else if("applyUser".equals(key)){
vars.get(key).getTextValue(); //请假人
}else if("applyDate".equals(key)){
vars.get(key).getTextValue(); //请假天数
}
//不用获取审批人和审批意见,因为审批过后流程已经完结,这里是查不到的
}
}
注:未完成任务暂存任务信息对应数据库表:act_ru_variable
6、历史记录
//根据流程id
String id = "rocess";
//获取历史记录
List<HistoricProcessInstance> list = historyService
.createHistoricProcessInstanceQuery()
.processDefinitionKey(id)
// .startedBy("admin") //根据发起流程的用户名称查询历史记录
.finished() //获取已完成的流程记录
// .unfinished() //获取未完成的流程记录
.orderByProcessInstanceEndTime().desc().list(); //根据流程结束时间倒序
//查询历史记录所对应的任务信息(上边方法中所填写的内容如:请假原因和审批意见)
if(list != null && list.size()>0){
for(HistoricProcessInstance hi:list){
//获取本条流程记录所对应的请假信息。
List<HistoricVariableInstance> varInstanceList = historyService.createHistoricVariableInstanceQuery() .processInstanceId(hi.getId()).list();
for(HistoricVariableInstance hv:varInstanceList){
String name = hv.getVariableName();
String value = hv.getValue().toString();
if("applyUser".equals(name)){
hic.setApplyUser(value); //申请人
}else if("applyName".equals(name)){
hic.setApplyName(value); //请假原因
}else if("applyDate".equals(name)){
hic.setApplyDate(value); //请假天数
}else if("auditUser".equals(name)){
hic.setAuditUser(value); //审核人
}else if("auditName".equals(name)){
hic.setAuditName(value); //审核结果
}
}
hi.getStartTime();//开始时间
hi.getEndTime(); //结束时间
}
}
注:历史记录 对应数据库表(详细):act_hi_actinst
注:历史记录 对应数据库表(简略):act_hi_procinst
注:历史记录任务信息 对应数据库表:act_hi_varinst
补充 activiti的28张数据库表-解析,请查看已有博客
https://www.cnblogs.com/mayhh/p/11214637.html
补充 activiti七大接口,主要用到的是前四个接口。
RepositoryService:提供一系列管理流程部署和流程定义的API。
RuntimeService:在流程运行时对流程实例进行管理与控制。
TaskService:对流程任务进行管理,例如任务提醒、任务完成和创建任务等。
HistoryService:对流程的历史数据进行操作,包括查询、删除这些历史数据。
IdentityService:提供对流程角色数据进行管理的API,这些角色数据包括用户组、用户及它们之间的关系。
ManagementService:提供对流程引擎进行管理和维护的服务。
FormService:表单服务。
下一篇: 计数器/定时器8253/8254
推荐阅读
-
activiti flowable 开源工作流引擎项目整合开发实施实践总结
-
java Activiti6 工作流引擎 websocket 即时聊天 SSM源码 支持手机即时通讯聊天
-
Activiti6.0 spring5 工作流引擎 java SSM流程审批 项目框架
-
java工作流引擎 Activiti6.0 websocket 即时聊天发图片文字 好友群组 SSM源码
-
Java Activiti 工作流引擎 springmvc SSM 流程审批 后台框架源码
-
Java工作流引擎 Activiti springmvc 后台框架源码 SSM 流程审批
-
Activiti工作流引擎学习笔记之一
-
Java Activiti6.0 spring5 SSM 工作流引擎 审批流程 java项目框架
-
Activiti6.0 java spring5 SSM 工作流引擎 审批流程 项目框架
-
activiti flowable 开源工作流引擎项目整合开发实施实践总结