全部开发者教程

企业级在线办公系统

上节课体验过了工作流的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);
        });
    }
}