【Activiti工作流】Activiti 并行子流程

【Activiti工作流】Activiti 并行子流程

  1. 业务场景
    流程发起后需要多个部门同时处理,部门数根据业务数据来定。一笔业务申请涉及到多个部门,发起岗提交给各个部门处理人,处理人处理后由各个部门的负责人审核,等待所有部门处理完提交给汇总岗汇总,最后交给汇总岗负责人确认,流程结束。
  2. 流程图绘制
    【Activiti工作流】Activiti 并行子流程_第1张图片
    子流程绘制
    【Activiti工作流】Activiti 并行子流程_第2张图片
    部门处理人,取传入的list中的元素【Activiti工作流】Activiti 并行子流程_第3张图片
  3. 部署流程
   @Test
    public void deploy() {
        // 获取仓库服务 :管理流程定义
        RepositoryService repositoryService = processEngine.getRepositoryService();
        Deployment deploy = repositoryService.createDeployment()// 创建一个部署的构建器
                .addClasspathResource("diagrams/WorkPlan.bpmn")// 从类路径中添加资源,一次只能添加一个资源
                .name("WorkPlan")// 设置部署的名称
                .category("办公类别")// 设置部署的类别
                .deploy();

        System.out.println("部署的id" + deploy.getId());
        System.out.println("部署的名称" + deploy.getName());
    }
  1. 启动流程
    流程正常启动,activiti 会根据传入的集合大小,创建对应个数的子流程。
 @Test
    public void startProcess() {
        // 指定执行我们刚才部署的工作流程
        String processDefiKey = "WorkPlan";
        // 业务流水号
        String businessKey = "SQ20191109052000001";
        // 取运行时服务
        RuntimeService runtimeService = processEngine.getRuntimeService();
        // 流程变量
        Map<String, Object> variables = new HashMap<>();
        List<String> list = new ArrayList<String>();
        list.add("张三");
        list.add("李四");
        variables.put("userList", list);
        // 取得流程实例
        ProcessInstance pi = runtimeService.startProcessInstanceByKey(processDefiKey, businessKey, variables);// 通过流程定义的key来执行流程
        System.out.println("流程实例id:" + pi.getId());// 流程实例id
        System.out.println("流程定义id:" + pi.getProcessDefinitionId());// 输出流程定义的id
        // 查询所有的子流程
        List<Task> taskList = processEngine.getTaskService().createTaskQuery()
                .processInstanceId(pi.getProcessInstanceId()).list();
        variables.clear();
        variables.put("approve_status", "111");
        // 完成当前节点
        for (Task task : taskList) {
            // 设置当前办理人为发起人
            processEngine.getTaskService().setAssignee(task.getId(), "发起人");
            // 完成当前子流程第一个节点
            processEngine.getTaskService().complete(task.getId(), variables);
        }
    }

这里list传入两个值,启动流程后,成功提交到两个节点。
【Activiti工作流】Activiti 并行子流程_第4张图片

至此可以正常走流程,等待所有子流程处理完,流程才会提交到汇总岗。

  1. 其他代码
    流程提交的方法
       // 完成任务
    @Test
    public void compileTask() {
        String taskId = "47532";
        Task task = processEngine.getTaskService().createTaskQuery().taskId(taskId).singleResult();
        // taskId:任务id
        Map<String, Object> variables = new HashMap<>();
        variables.put("approve_status", "111");
        processEngine.getTaskService().complete(taskId, variables);
        Task nexttask = processEngine.getTaskService().createTaskQuery()
                .processInstanceBusinessKey("SQ20191109052000001")//业务流水号
                .executionId(task.getExecutionId())//当前执行ID
                .singleResult();
        if (nexttask != null) {
            switch (nexttask.getName()) {
            case "部门负责人":
                processEngine.getTaskService().setAssignee(nexttask.getId(), task.getAssignee() + "负责人");
                break;
            case "发起岗":
                processEngine.getTaskService().setAssignee(nexttask.getId(), task.getAssignee() + "发起岗");
                break;
            }

        }
        System.out.println(nexttask.getId());
        System.out.println("当前任务执行完毕" + taskId);
    }

查询处理人任务的方法

    /** 查询当前的个人任务(实际就是查询act_ru_task表) */
    @Test
    public void findMyPersonalTask() {
        String assignee = "张三";
        // 获取事务Service
        TaskService taskService = processEngine.getTaskService();
        List<Task> taskList = taskService.createTaskQuery()// 创建任务查询对象
                .taskAssignee(assignee)// 指定个人任务查询,指定办理人
                .list();// 获取该办理人下的事务列表
        if (taskList != null && taskList.size() > 0) {
            for (Task task : taskList) {
                System.out.println("#############################################");
                System.out.println("任务ID:" + task.getId());
                System.out.println("任务名称:" + task.getName());
                System.out.println("任务的创建时间:" + task.getCreateTime());
                System.out.println("任务办理人:" + task.getAssignee());
                System.out.println("流程实例ID:" + task.getProcessInstanceId());
                System.out.println("执行对象ID:" + task.getExecutionId());
                System.out.println("流程定义ID:" + task.getProcessDefinitionId());
                System.out.println("#############################################");
            }
        } else {
            System.out.println(assignee + "没有正在处理的任务");
        }
    }

yusys 宇信科技


你可能感兴趣的:(【Activiti工作流】Activiti 并行子流程)