上节课体验过了工作流的ServiceTask,这节课我们来学习UserTask任务的使用,也就是必须由人工审批的任务。如果没有人审批,那么工作流程就一直阻塞,不会继续往下执行。
一、绘制工作流
我们绘制一个两个角色参与审批的请假流程,里面没有分支,只是线性的任务申请和审批。
把下载的XML文件改名之后放在bpmn文件夹里面。
修改XML文件的内容,给员工申请和经理审批两个UserTask任务设置上关联的执行人。其中${empId}
代表请假人并不是固定的,任何员工想要请假,就把员工ID作为参数传给工作流,于是这个请假就跟这个员工关联上了。
最后把这个XML文件拷贝到processes文件夹里面,随着程序的运行会自动部署。
二、执行工作流
为了测试多角色审批,我们创建Demo_2.java
类,然后在里面定义四个测试函数,分别运行工作流、员工申请、经理审批,以及查看审批结果。
@SpringBootTest
public class Demo_2 {
@Resource
private RuntimeService runtimeService;
@Resource
private TaskService taskService;
@Resource
private HistoryService historyService;
@Test
public void test_1() {
//设置工作流参数
HashMap param = new HashMap() {{
put("empId", "9527"); //申请人
put("managerId", "9528"); //审批人
put("reason", "病假休息一天");
}};
runtimeService.startProcessInstanceByKey("demo_2", param).getProcessInstanceId();
}
@Test
public void test_2() {
//以9527查找跟自己有关的工作流任务
List<Task> list = taskService.createTaskQuery().includeProcessVariables().includeTaskLocalVariables()
.taskAssignee("9527").orderByTaskCreateTime().desc().list();
list.forEach(task -> {
if (task.getName().equals("员工申请")) {
//TODO 员工上传请假单
taskService.complete(task.getId()); //执行任务
System.out.println("员工任务执行完毕");
}
});
}
@Test
public void test_3() {
//以9528查找跟自己有关的工作流任务
List<Task> list = taskService.createTaskQuery().includeProcessVariables().includeTaskLocalVariables()
.taskAssignee("9528").orderByTaskCreateTime().desc().list();
list.forEach(task -> {
task.getProcessVariables();
if (task.getName().equals("经理审批")) {
Map<String, Object> variables = task.getProcessVariables();
variables.put("result", "同意");
taskService.setVariables(task.getId(), variables);
taskService.complete(task.getId());
System.out.println("经理任务执行完毕");
}
});
}
@Test
public void test_4() {
//以9527查找跟自己有关的已经执行完成的工作流
List<HistoricTaskInstance> list = historyService.createHistoricTaskInstanceQuery()
.includeTaskLocalVariables().includeProcessVariables().taskAssignee("9527").processFinished()
.orderByTaskCreateTime().desc().list();
list.forEach(task -> {
//任务审批结果
Object result=task.getProcessVariables().get("result");
System.out.println(result);
});
}
}