当前位置: 代码迷 >> 综合 >> 【Activiti工作流】Activiti 并行子流程
  详细解决方案

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

热度:51   发布时间:2023-12-06 00:19:08.0

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

  1. 业务场景
    流程发起后需要多个部门同时处理,部门数根据业务数据来定。一笔业务申请涉及到多个部门,发起岗提交给各个部门处理人,处理人处理后由各个部门的负责人审核,等待所有部门处理完提交给汇总岗汇总,最后交给汇总岗负责人确认,流程结束。
  2. 流程图绘制
    完整流程图
    子流程绘制
    子流程
    部门处理人,取传入的list中的元素在这里插入图片描述
  3. 部署流程
   @Testpublic 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 会根据传入的集合大小,创建对应个数的子流程。
 @Testpublic 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());// 流程实例idSystem.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传入两个值,启动流程后,成功提交到两个节点。
在这里插入图片描述

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

  1. 其他代码
    流程提交的方法
       // 完成任务@Testpublic void compileTask() {
    String taskId = "47532";Task task = processEngine.getTaskService().createTaskQuery().taskId(taskId).singleResult();// taskId:任务idMap<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表) */@Testpublic void findMyPersonalTask() {
    String assignee = "张三";// 获取事务ServiceTaskService 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


  相关解决方案