欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

activiti 工作流引擎 - 接口实战运用

程序员文章站 2022-03-15 14:04:01
...

1、依据简单的 开始–>申请–>审批–>结束 流程步骤解析接口方法。
该流程图使用eclipse的activiti插件所画,插件安装步骤:https://blog.csdn.net/wangshao5122/article/details/100920422
activiti 工作流引擎 - 接口实战运用
申请操作指定操作人为:admin
activiti 工作流引擎 - 接口实战运用
审批则使用动态变量后期设定审批人: ${username}
activiti 工作流引擎 - 接口实战运用
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:表单服务。