精华内容
下载资源
问答
  • CAD图纸并行设计审批流程图,从校核、校审、审批及其下属流程工艺、标检等
  • assigneeList 为 集合,例如["kermit", "gonzo", "fozzie"];... } } 流程图核心xml SequenceFlow_175153q SequenceFlow_0d2cc0g ${num} ${(nrOfCompletedInstances == nrOfInstances) || (pass == 'no')}

     

    image.png

     

    assigneeList 为 集合,例如["kermit", "gonzo", "fozzie"];

    activiti:elementVariable="assignee" 为 接收 loop 中的值的变量名;

    activiti:assignee="${assignee}" 相当于将认领人指定为loop中取得的变量对象,就和java 中 foreach 差不多的意思;

    nrOfInstances:实例总数

    nrOfActiveInstances:当前活动(即尚未完成)实例的数量。对于顺序多实例,这将始终为1。

    nrOfCompletedInstances:已完成实例的数量。

    注意,这三个变量存在当前执行的父执行中。

    ${nrOfCompletedInstances/nrOfInstances >= 0.6 } ,意思不言而喻,就是完成改执行的量大于等于60%就可以通过该节点进入下一节点。

     

    image.png

     

    配置节点监听器

     

    import com.triman.zhxz.xsgl.utils.SpringUtils;
    import org.activiti.engine.TaskService;
    import org.activiti.engine.delegate.DelegateExecution;
    import org.activiti.engine.delegate.ExecutionListener;
    import org.activiti.engine.task.Task;
     
    import java.util.Map;
     
    /**
     * 消息通知任务监听器
     */
    public class FileCheckExecutionListener implements ExecutionListener {
     
     
        @Override
        public void notify(DelegateExecution execution) {
            System.out.println("进入监听器 - FileCheckExecutionListener ...");
            //修改审批状态
            Map<String, Object> variables = execution.getVariables();
            System.out.println("运行变量");
            System.out.println(variables);
            execution.setVariable("pass","no");
    
    //在执行监听器中通过,执行实例id获取当前任务信息
    //        TaskService taskService = SpringUtils.getBean(TaskService.class);
    //        Task task = taskService.createTaskQuery().processInstanceId(execution.getProcessInstanceId()).executionId(execution.getId()).singleResult();
    //        if (task == null) {
    //            return;
    //        }
    //获取当前任务执行人
    //        String assignee = task.getAssignee();
    //        System.out.println(assignee);
    //全部审批完
    //            Integer complete = (Integer) execution.getParent().getVariable("nrOfCompletedInstances");
    //            Integer all = (Integer) execution.getParent().getVariable("nrOfInstances");
    //            execution.setVariable("nrOfCompletedInstances", complete);
    //            //说明都完成了并且没有人拒绝
    //            if ((complete + 1) / all == 1) {
    //                execution.setVariable("pass", "no");
    //            }
            System.out.println("离开监听器 - FileCheckExecutionListener ...");
        }
    }

     

    流程图核心xml

      <callActivity id="callactivity1" name="子流程" calledElement="${call}" activiti:inheritVariables="false">
          <extensionElements>
            <activiti:in source="startUserId" target="startUserId" />
            <activiti:executionListener class="com.triman.zhxz.xsgl.service.FileCheckExecutionListener" event="end" />
          </extensionElements>
          <incoming>SequenceFlow_175153q</incoming>
          <outgoing>SequenceFlow_0d2cc0g</outgoing>
          <multiInstanceLoopCharacteristics activiti:collection="${assigneeList}" activiti:elementVariable="${startUserId}">
            <loopCardinality>${num}</loopCardinality>
            <completionCondition>${(nrOfCompletedInstances == nrOfInstances) || (pass == 'no')}</completionCondition>
          </multiInstanceLoopCharacteristics>
        </callActivity>

     

    展开全文
  • 1、一个支持增加节点、删除节点、修改节点的流程图,增加节点可选择并行、串行、会签、下一节点并行等状态; 2、支持设置条件、删除条件、查看条件; 3、可直观显示已完成的节点和不可查看的节点,真正做到了流程...
  • 回退操作是指,将流程退回到上一个节点,基本思路是通过审批历史服务HistoryService找到审批审批的上一节点,然后跟通用拒绝操作类似,将流程拨回到该节点,要注意的一个问题是,如果碰到并行审批,在并行线上回退...

    文章目录

    1. 说明

    回退操作是指,将流程退回到上一个节点,基本思路是通过审批历史服务HistoryService找到审批审批的上一节点,然后跟通用拒绝操作类似,将流程拨回到该节点,要注意的一个问题是,如果碰到并行审批,在并行线上回退应该回退到哪里呢?
    在这里插入图片描述
    如图,如果审批顺序为主管审批->上级领导审批->董事长审批,这时候总监审批执行回退操作,应该回退到哪个节点呢,显然不是董事长,因为这是两个并行互不干扰的审批,正常应该回退到主管审批这里,所以回退操作应该是基于execution的回退。

    2. 实现

    Bpmn文件:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" xmlns:tns="http://www.activiti.org/test" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" expressionLanguage="http://www.w3.org/1999/XPath" id="m1597729482723" name="" targetNamespace="http://www.activiti.org/test" typeLanguage="http://www.w3.org/2001/XMLSchema">
      <process id="parallel" isClosed="false" isExecutable="true" processType="None">
        <startEvent id="_2" name="开始"/>
        <userTask activiti:assignee="user1" activiti:exclusive="true" id="_3" name="项目经理审批"/>
        <parallelGateway gatewayDirection="Unspecified" id="_4" name="ParallelGateway"/>
        <userTask activiti:assignee="user2" activiti:exclusive="true" id="_5" name="上级领导审批"/>
        <userTask activiti:assignee="user3" activiti:exclusive="true" id="_6" name="董事长审批"/>
        <userTask activiti:assignee="user4" activiti:exclusive="true" id="_7" name="主管审批"/>
        <userTask activiti:assignee="user5" activiti:exclusive="true" id="_8" name="总监审批"/>
        <parallelGateway gatewayDirection="Unspecified" id="_9" name="ParallelGateway"/>
        <endEvent id="_10" name="结束"/>
        <sequenceFlow id="_11" sourceRef="_2" targetRef="_3"/>
        <sequenceFlow id="_12" sourceRef="_3" targetRef="_4"/>
        <sequenceFlow id="_13" sourceRef="_4" targetRef="_5"/>
        <sequenceFlow id="_14" sourceRef="_4" targetRef="_7"/>
        <sequenceFlow id="_15" sourceRef="_5" targetRef="_6"/>
        <sequenceFlow id="_16" sourceRef="_7" targetRef="_8"/>
        <sequenceFlow id="_17" sourceRef="_6" targetRef="_9"/>
        <sequenceFlow id="_18" sourceRef="_8" targetRef="_9"/>
        <sequenceFlow id="_19" sourceRef="_9" targetRef="_10"/>
      </process>
      <bpmndi:BPMNDiagram documentation="background=#000000;count=1;horizontalcount=1;orientation=0;width=842.4;height=1195.2;imageableWidth=832.4;imageableHeight=1185.2;imageableX=5.0;imageableY=5.0" id="Diagram-_1" name="New Diagram">
        <bpmndi:BPMNPlane bpmnElement="parallel">
          <bpmndi:BPMNShape bpmnElement="_2" id="Shape-_2">
            <omgdc:Bounds height="32.0" width="32.0" x="285.0" y="-10.0"/>
            <bpmndi:BPMNLabel>
              <omgdc:Bounds height="32.0" width="32.0" x="0.0" y="0.0"/>
            </bpmndi:BPMNLabel>
          </bpmndi:BPMNShape>
          <bpmndi:BPMNShape bpmnElement="_3" id="Shape-_3">
            <omgdc:Bounds height="55.0" width="85.0" x="260.0" y="60.0"/>
            <bpmndi:BPMNLabel>
              <omgdc:Bounds height="55.0" width="85.0" x="0.0" y="0.0"/>
            </bpmndi:BPMNLabel>
          </bpmndi:BPMNShape>
          <bpmndi:BPMNShape bpmnElement="_4" id="Shape-_4">
            <omgdc:Bounds height="32.0" width="32.0" x="285.0" y="145.0"/>
            <bpmndi:BPMNLabel>
              <omgdc:Bounds height="32.0" width="32.0" x="0.0" y="0.0"/>
            </bpmndi:BPMNLabel>
          </bpmndi:BPMNShape>
          <bpmndi:BPMNShape bpmnElement="_5" id="Shape-_5">
            <omgdc:Bounds height="55.0" width="85.0" x="190.0" y="265.0"/>
            <bpmndi:BPMNLabel>
              <omgdc:Bounds height="55.0" width="85.0" x="0.0" y="0.0"/>
            </bpmndi:BPMNLabel>
          </bpmndi:BPMNShape>
          <bpmndi:BPMNShape bpmnElement="_6" id="Shape-_6">
            <omgdc:Bounds height="55.0" width="85.0" x="190.0" y="405.0"/>
            <bpmndi:BPMNLabel>
              <omgdc:Bounds height="55.0" width="85.0" x="0.0" y="0.0"/>
            </bpmndi:BPMNLabel>
          </bpmndi:BPMNShape>
          <bpmndi:BPMNShape bpmnElement="_7" id="Shape-_7">
            <omgdc:Bounds height="55.0" width="85.0" x="335.0" y="265.0"/>
            <bpmndi:BPMNLabel>
              <omgdc:Bounds height="55.0" width="85.0" x="0.0" y="0.0"/>
            </bpmndi:BPMNLabel>
          </bpmndi:BPMNShape>
          <bpmndi:BPMNShape bpmnElement="_8" id="Shape-_8">
            <omgdc:Bounds height="55.0" width="85.0" x="335.0" y="405.0"/>
            <bpmndi:BPMNLabel>
              <omgdc:Bounds height="55.0" width="85.0" x="0.0" y="0.0"/>
            </bpmndi:BPMNLabel>
          </bpmndi:BPMNShape>
          <bpmndi:BPMNShape bpmnElement="_9" id="Shape-_9">
            <omgdc:Bounds height="32.0" width="32.0" x="290.0" y="530.0"/>
            <bpmndi:BPMNLabel>
              <omgdc:Bounds height="32.0" width="32.0" x="0.0" y="0.0"/>
            </bpmndi:BPMNLabel>
          </bpmndi:BPMNShape>
          <bpmndi:BPMNShape bpmnElement="_10" id="Shape-_10">
            <omgdc:Bounds height="32.0" width="32.0" x="290.0" y="645.0"/>
            <bpmndi:BPMNLabel>
              <omgdc:Bounds height="32.0" width="32.0" x="0.0" y="0.0"/>
            </bpmndi:BPMNLabel>
          </bpmndi:BPMNShape>
          <bpmndi:BPMNEdge bpmnElement="_13" id="BPMNEdge__13" sourceElement="_4" targetElement="_5">
            <omgdi:waypoint x="285.0" y="161.0"/>
            <omgdi:waypoint x="235.0" y="230.0"/>
            <omgdi:waypoint x="235.0" y="265.0"/>
            <bpmndi:BPMNLabel>
              <omgdc:Bounds height="0.0" width="0.0" x="0.0" y="0.0"/>
            </bpmndi:BPMNLabel>
          </bpmndi:BPMNEdge>
          <bpmndi:BPMNEdge bpmnElement="_12" id="BPMNEdge__12" sourceElement="_3" targetElement="_4">
            <omgdi:waypoint x="301.0" y="115.0"/>
            <omgdi:waypoint x="301.0" y="145.0"/>
            <bpmndi:BPMNLabel>
              <omgdc:Bounds height="0.0" width="0.0" x="0.0" y="0.0"/>
            </bpmndi:BPMNLabel>
          </bpmndi:BPMNEdge>
          <bpmndi:BPMNEdge bpmnElement="_15" id="BPMNEdge__15" sourceElement="_5" targetElement="_6">
            <omgdi:waypoint x="232.5" y="320.0"/>
            <omgdi:waypoint x="232.5" y="405.0"/>
            <bpmndi:BPMNLabel>
              <omgdc:Bounds height="0.0" width="0.0" x="0.0" y="0.0"/>
            </bpmndi:BPMNLabel>
          </bpmndi:BPMNEdge>
          <bpmndi:BPMNEdge bpmnElement="_14" id="BPMNEdge__14" sourceElement="_4" targetElement="_7">
            <omgdi:waypoint x="317.0" y="161.0"/>
            <omgdi:waypoint x="375.0" y="225.0"/>
            <omgdi:waypoint x="375.0" y="265.0"/>
            <bpmndi:BPMNLabel>
              <omgdc:Bounds height="0.0" width="0.0" x="0.0" y="0.0"/>
            </bpmndi:BPMNLabel>
          </bpmndi:BPMNEdge>
          <bpmndi:BPMNEdge bpmnElement="_17" id="BPMNEdge__17" sourceElement="_6" targetElement="_9">
            <omgdi:waypoint x="235.0" y="460.0"/>
            <omgdi:waypoint x="235.0" y="490.0"/>
            <omgdi:waypoint x="290.0" y="546.0"/>
            <bpmndi:BPMNLabel>
              <omgdc:Bounds height="0.0" width="0.0" x="0.0" y="0.0"/>
            </bpmndi:BPMNLabel>
          </bpmndi:BPMNEdge>
          <bpmndi:BPMNEdge bpmnElement="_16" id="BPMNEdge__16" sourceElement="_7" targetElement="_8">
            <omgdi:waypoint x="377.5" y="320.0"/>
            <omgdi:waypoint x="377.5" y="405.0"/>
            <bpmndi:BPMNLabel>
              <omgdc:Bounds height="0.0" width="0.0" x="0.0" y="0.0"/>
            </bpmndi:BPMNLabel>
          </bpmndi:BPMNEdge>
          <bpmndi:BPMNEdge bpmnElement="_19" id="BPMNEdge__19" sourceElement="_9" targetElement="_10">
            <omgdi:waypoint x="306.0" y="562.0"/>
            <omgdi:waypoint x="306.0" y="645.0"/>
            <bpmndi:BPMNLabel>
              <omgdc:Bounds height="0.0" width="0.0" x="0.0" y="0.0"/>
            </bpmndi:BPMNLabel>
          </bpmndi:BPMNEdge>
          <bpmndi:BPMNEdge bpmnElement="_18" id="BPMNEdge__18" sourceElement="_8" targetElement="_9">
            <omgdi:waypoint x="380.0" y="460.0"/>
            <omgdi:waypoint x="380.0" y="490.0"/>
            <omgdi:waypoint x="322.0" y="546.0"/>
            <bpmndi:BPMNLabel>
              <omgdc:Bounds height="0.0" width="0.0" x="0.0" y="0.0"/>
            </bpmndi:BPMNLabel>
          </bpmndi:BPMNEdge>
          <bpmndi:BPMNEdge bpmnElement="_11" id="BPMNEdge__11" sourceElement="_2" targetElement="_3">
            <omgdi:waypoint x="301.0" y="22.0"/>
            <omgdi:waypoint x="301.0" y="60.0"/>
            <bpmndi:BPMNLabel>
              <omgdc:Bounds height="0.0" width="0.0" x="0.0" y="0.0"/>
            </bpmndi:BPMNLabel>
          </bpmndi:BPMNEdge>
        </bpmndi:BPMNPlane>
      </bpmndi:BPMNDiagram>
    </definitions>
    

    测试类:

    package com.yb;
    
    import com.yb.utils.DeleteTaskCommand;
    import com.yb.utils.JumpCommand;
    import org.activiti.bpmn.model.FlowNode;
    import org.activiti.bpmn.model.Process;
    import org.activiti.engine.*;
    import org.activiti.engine.history.HistoricTaskInstance;
    import org.activiti.engine.repository.Deployment;
    import org.activiti.engine.runtime.ProcessInstance;
    import org.activiti.engine.task.Task;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.test.context.junit4.SpringRunner;
    
    import javax.annotation.Resource;
    import java.util.List;
    
    /**
     * @author liangjie@itcast.cn
     * @version 1.0
     * @date 2020/8/5
     */
    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class ActivitiJpaTest10 {
    
        @Resource
        private RepositoryService repositoryService;
        @Resource
        private RuntimeService runtimeService;
        @Resource
        private TaskService taskService;
        @Resource
        private HistoryService historyService;
    
        @Resource
        private ManagementService managementService;
        /**
         * 部署流程,测试征询
         */
        @Test
        public void repositoryDeploy(){
            Deployment deploy = repositoryService.createDeployment()
                    .addClasspathResource("processes/activiti_ParallelFallback.bpmn")
                    .addClasspathResource("processes/activiti_ParallelFallback.png")
                    .name("测试并行流程回退-1")
                    .deploy();
            System.out.println("部署ID:"+deploy.getId());
            System.out.println("部署名称"+deploy.getName());
        }
    
        /**
         * 发布流程
         */
        @Test
        public void runtimeRelease(){
    
            ProcessInstance pi = runtimeService.startProcessInstanceByKey("parallel");
            System.out.println("流程实例ID:"+pi.getId());
            System.out.println("流程定义ID:"+pi.getProcessDefinitionId());
        }
    
        /**
         * 查询及完成任务
         */
        @Test
        public void taskQueryComplete(){
            List<Task> list = taskService.createTaskQuery()
                    .taskAssignee("user1")
                    .list();
            for (Task task : list) {
                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("--------------------------------------------");
                taskService.complete(task.getId());
            }
        }
    
        /**
         * 流程回退
         */
        @Test
        public void taskBack(){
            Task task = taskService.createTaskQuery()
                    .taskAssignee("user4")
                    .singleResult();
    
            Process process = repositoryService.getBpmnModel(task.getProcessDefinitionId()).getMainProcess();
    
            FlowNode flowNode = (FlowNode) process.getFlowElement("_3");
    
            String s = managementService.executeCommand(new DeleteTaskCommand(task.getId()));
    
            managementService.executeCommand(new JumpCommand(flowNode,s));
    
        }
    
    
        /**
         * 根据流程实例id获取上一个节点的信息
         */
        @Test
        public void queryUpOneNode(){
            Task task = taskService.createTaskQuery()
                    .taskAssignee("user4")
                    .singleResult();
            List<HistoricTaskInstance> list = historyService.createHistoricTaskInstanceQuery()
                    .processInstanceId(task.getProcessInstanceId())
                    .orderByHistoricTaskInstanceEndTime()
                    .desc()
                    .list();
    
            HistoricTaskInstance taskInstance = null;
    
            if(!list.isEmpty()){
                if(list.get(0).getEndTime()!=null){
                    taskInstance=list.get(0);
                }
            }
            System.out.println(list.get(0).getEndTime());
            System.out.println(taskInstance.getTaskDefinitionKey()+"==="+taskInstance.getName());
        }
    }
    

    测试结果:
    当前测试流程:项目经理审批→(主管审批→撤回操作)→上级领导审批(不做审批)→(项目经理审批→提交,上级领导审批)→(上级领导审批,上级领导审批,主管审批))
    错误:
    并行流程,支线回退时,只删除了自己的任务,另外一个并行的任务依然存在,这样就会导致数据库中,act_ru_task表中数据会有多余的一条任务信息。
    在这里插入图片描述
    出现的问题:
    并行流程回退操作时,支线回退到主线,所有并行支线需要删除,否则会出现重复任务。

    解决:
    并行支线回退时,直接回退到项目经理审批节点,进行重新审批。

    	/**
         * 流程回退
         */
        @Test
        public void taskBack(){
            Task task = taskService.createTaskQuery()
                    .taskAssignee("user5")
                    .singleResult();
    
            List<Task> list = taskService.createTaskQuery()
                    .processInstanceId(task.getProcessInstanceId())
                    .list();
            Process process = repositoryService.getBpmnModel(task.getProcessDefinitionId()).getMainProcess();
            
            //通过项目经理审批节点id获取到流程
            FlowNode flowNode = (FlowNode) process.getFlowElement("_3");
            //删除当前所有任务
            String s = null;
            for (Task task1 : list) {
                DeleteTaskCommand deleteTaskCommand = new DeleteTaskCommand(task1.getId());
                s = managementService.executeCommand(deleteTaskCommand);
            } 
    //        String s = managementService.executeCommand(new DeleteTaskCommand(task.getProcessInstanceId()));
    //        managementService.executeCommand()
            //跳转到项目经理审批节点
            managementService.executeCommand(new JumpCommand(flowNode,s));
        }
    

    数据库:
    在这里插入图片描述

    展开全文
  • 点击▲关注 “爪哇笔记” 给公众号标星置顶更多精彩 第一时间直达概念Activiti 提供了两种基于子流程的实现:一种是内嵌子流程:子流程元素<subProc...

    点击▲关注 “爪哇笔记”   给公众号标星置顶

    更多精彩 第一时间直达

    640?wx_fmt=jpeg 概念
    Activiti 提供了两种基于子流程的实现:
    • 一种是内嵌子流程:子流程元素 <subProcess>内嵌在主流程元素 <process>之内,只能在该流程中使用该子流程,外部是无法访问到的。这种子流程一般作为局部通用逻辑处理,或者因为特定业务需要,使得比较复杂的单个主流程设计清晰直观。

    • 另一种是调用子流程:首先实现一个流程,在另一个流程中可以调用该流程,通常可以定义一些通用的流程作为这种调用子流程,供其他多个流程定义复用。这种子流程使用 <callActivity>元素来进行调用,间接地嵌入到主流程中,用起来比较方便。

    流程图

    640?wx_fmt=png
    以上是一个公司内部合同评审的内嵌子流程流程图,一个合同的通过是需要经过多个部门的层层审核,最终才得以通过。
    • 销售发起合同评审流程

    • 进入子流程,各个部门根据实际情况进行多级审批

    • 各个部门审批通过,流程结束

    生成子流程

    XML部分代码

    /**	
     * 博客 https://blog.52itstyle.vip	
     */	
    <subProcess id="subprocess" name="合同评审">	
          <multiInstanceLoopCharacteristics isSequential="false" activiti:collection="assigneeList" activiti:elementVariable="assignee">	
            <completionCondition>${nrOfCompletedInstances/nrOfInstances==1}</completionCondition>	
          </multiInstanceLoopCharacteristics>	
          <!--省略相关任务节点代码-->	
    </subProcess>
    • collection:存放集合,集合中可以存任意值,工作流会根据你集合里的值个数,去生成对应的子流程,这里我们存放一级审批的用户ID。

    • elementVariable:节点流程变量,用于在流程图中代替集合中表示当前子流程的变量,对应子流程中第一个任务节点的变量名。

    • completionCondition:完成条件,这里写的表达式如果满足即可流转到下一步。

    发起

    成功发起之后,系统会自动生成集合数量的任务(子流程),然后在每个子流程中设置与业务流程相关的局部变量。
    /**	
     * 博客 https://blog.52itstyle.vip	
     */	
    Map<String, Object> variables = new HashMap<>();	
    //4个部门审核,生成4个流程,集合中获取并存放的是一级评审人	
    List<String> assigneeList= Arrays.asList(new String[] {"1","2","3","4"});	
    variables.put("assigneeList", assigneeList);	
    ProcessInstance in =  runtimeService.startProcessInstanceByKey("contract_review", variables);	
    List<Task> list = taskService.createTaskQuery().processInstanceId(in.getId()).list();	
    System.out.println("任务数量:"+list.size());	
    list.forEach(task -> {	
        /**	
         * 模拟几级审批(正式环境要从配置或者数据库读取),因为这里要清楚每个部门走几级审批逻辑	
         * 变量存放到每个任务节点的全局任务变量中	
         */	
        Random r = new Random();//创建随机种子,Random对象	
        int rank = r.nextInt(3)+1;	
        System.out.println("任务ID:"+task.getId());	
        System.out.println("指派人ID:"+task.getAssignee());	
        taskService.setVariableLocal(task.getId(),"rank",rank);	
    });

    审核

    这里只说几个比较重要的点,大家可以根据自身业务场景处理。
    /**	
     * 博客 https://blog.52itstyle.vip	
     */	
    //获取当前任务	
    Task task = taskService.createTaskQuery().taskId(taskId).singleResult();	
    //获取当前任务Code	
    String taskCode = task.getTaskDefinitionKey();	
    //获取当前任务流转唯一ID	
    String executionId = task.getExecutionId();	
    //获取当前子流程任务变量	
    Object rank = taskService.getVariableLocal(task.getId(),"rank");	
    //认领任务	
    variables.put("approve",rank);	
    taskService.claim(taskId, userId);	
    taskService.complete(taskId, variables);	
    //这里要判断当前子流程是一级审批、如果是二级审批或者三级审批还需要获取下级任务节点	
    task = taskService.createTaskQuery().executionId(executionId).active().singleResult();	
    //指派任务	
    taskService.addCandidateUser(task.getId(),reviewUserId);

    小结

    子流程的概念用途还是比较广泛的,基本上企业内部涉及到多部门合作的流程都有可能用到,这里需要注意的是,由于业务类型不同,每个子流程的相关逻辑判断也可能不同,这就需要在每个子流程中存储流程变量,用于各级流程逻辑判断。
    640?wx_fmt=jpeg
    ▲一个有温度的公众号,期待与你一起进步
    展开全文
  • 流程中三个活动并行(并非多人审核)

    千次阅读 2008-06-15 20:04:17
    驳回的那条走同时走三条线 另外两个为或即可,然后根据阀值就会判断是否为驳回,这样无需做任何开发,只是上符号比较多而已
    驳回的那条走同时走三条线

    另外两个为或即可,然后根据阀值就会判断是否为驳回,这样无需做任何开发,只是图上符号比较多而已
    展开全文
  • 【Activiti工作流】Activiti 并行流程

    千次阅读 2019-11-09 04:04:05
    流程图绘制 流程图绘制 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 新的改变 我们对Markdown编辑器...
  • Activiti 查看流程图和已执行节点高亮 如图: 图中绿色为已经执行的节点,红色为当前正在执行的节点。 html <div class="approve_content" v-if="active==2"> <div class="approve_div"> <el-alert ...
  • 目录排他网关并行网关 排他网关 业务场景 某一家公司最近在给一个单位做一个财务审批的OA。具体需求是这样的:当部门申请的金额小于一万块的时候,财务部...我这个流程图就是模拟这个业务场景画的,第一个是money&l...
  • 作者简介 本文由西邮陈莉君教授研一学生梁金荣、戴君毅、马明慧翻译,宋宝华老师指导和审核。译者梁金荣、戴君毅、马明慧同学热爱开源,践行开放、自由和分享。点击左下角阅读原文可直达英文版原文...
  • uml之程序流程图

    千次阅读 2019-05-16 14:39:02
    一、程序流程图 1.1 背景 程序流程图又称为程序框图,它是使用最悠久、使用最广泛的描述过程设计的方法,然而它也是用的最混乱的一种方法 1.2 主要缺点 程序流程图的主要缺点: 程序流程图不易表示数据结构...
  • 并发,并行与串行的区别

    千次阅读 2019-12-20 18:03:54
    并发(concurrency)和并行(parallellism)是: 并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔发生。 并发的关键是你有处理多个任务的能力,不一定要同时。 并行的关键是你有...
  • Activiti工作流--并行网关--之九

    千次阅读 2018-10-13 20:45:38
    并行网关是不需要设置流程变量的,并行网关不在流程变量的范围内 比如: 在开完某个产品设计会以后,需要对会议约定一些事项进行签字画押涉及到两个部门(产品部/研发部)的主管和经理 确认的顺序: a:产品部的主管...
  • 软件开发流程图模板

    2020-08-10 22:59:06
    软件开发流程图 软件开发流程即软件设计思路和方法的一般过程,包括对软件先进行需求分析,设计软件的功能和实现的算法和方法、软件的总体结构设计和模块设计、编码和调试、程序联调和测试。软件项目开发流程图是...
  • 网关和分支是流程图中相当重要的一环。毕竟一个流程不可能是一条直线走到底的,可能需要并行处理,也可能需要根据条件的不同选择对应的路由,网关和分支的作用正是在此。本文主要探索一下这几种网关的常用方法,以及...
  • 深入理解activiti并行网关

    千次阅读 2018-06-06 23:32:32
    有一段时间没有更新博文了,因为最近一直在写项目,没有太多的时间练习数据结构和算法,所以今天呢我和大家分享一下最近在项目中总结的一个比较重要的应用-activiti并行网关,如果我们经常开发的是一些管理系统,呢...
  • 1. 先贴出流程图,代码是根据流程图写的,大概就是这么一个思路,可自行根据思路更改。 2. 并行任务撤回 出差申请撤回任务,由于任务已经到了技术经理和项目经理那里,所以必须将技术经理和项目经理的任务同时回撤...
  • Activiti6.0(六)并行网关的使用

    千次阅读 2020-02-06 11:10:32
    1、绘制流程图 2、启动流程实例 3、流程流转 一、概述 这也是我们实际场景中用的比较多的网关,并行网关可以表示流程中的并发情况,它允许将流程分成多条分支,也可以将多条分支汇聚到一起,并行网关的功能是...
  • 专栏上一章简单介绍了通过判断...下面我们复制一个请假流程图:首先介绍怎么中间的叉号图,叉号即网关,所以找到右侧工具栏的gateway,改好后我们看三条判断的先,leave days&lt;3表示请假小于3天的走的流程,对...
  • 并行网关是指流程中需要并行执行的部分,他允许流程从一个流程分出多个分支,也可以把多个流程合并成一个。 就像上面说到的,并行网关有两个功能,分别是分支和汇聚: 分支:由一个分支分成多个分支,为每个顺序流...
  • 并行网关用于处理流程并发的场景,可以将流程分发到多个执行流程,也可以让多个执行流程合并为一个执行流(但不是必须一起使用),也就是说并行网关有两种行为,分叉和合并。下面 我们来一起看下。假设学生请假同时由...
  • ... 驳回:当前处理人可以驳回历史走过的任何一个节点 1、驳回任意普通节点 2、驳回多实例节点 ...3、驳回并行网关节点 4、驳回子流程节点 5、子流程节点驳回主流程节点 实际情况中,为了获取可驳回...
  • 由于公司需要在流程图中明确的显示不同部门的流程情况,而这些部门是并行的,最后要有系统自动判断这些节点的审核结果给出一个最终的结果,来确定流程的走向,如果是单个审核节点的话可以使用多实例(设置多实例结束...
  • 想要的效果是,在任务分发给会计1和风控1后,如果风控审核不通过,需要直接结束流程,但是在实际测试时,在风控驳回不通过后,流程实例并未消失,会计1角色依然有待办任务,流程实例在网关聚合后才会制行结束流 ...
  • activiti并行网关(Parallel Gateway)

    千次阅读 2018-05-05 13:19:01
    1.什么是并行网关?它可以将分支(fork)为多个路径,也可以合并(join)多个入口路径。2.使用场景:场景一:在一个政府机关的办公OA系统设计的时候,有这么一个需求:政府需要做一个财务呈批的业务,由财务部门发起...
  • 【activiti 入门】activiti6.0之并行网关

    千次阅读 2019-09-24 11:02:27
    首先是环境搭建可参考之前的博客,而且有具体demo提供下载...接下来准备绘制流程图: 具体的xml代码如下: <?xml version="1.0" encoding="UTF-8" standalone="yes"?...
  • Activiti并行网关

    千次阅读 2017-03-14 16:42:11
    在我上一篇博文上讲了 排他...重新画一个流程图取名 employeeMyProcess4.bpmn: 整体业务是: 员工发起请假申请——>需要项目组长、项目经理多同意审批——>才进入最好部门总监审批 ——>需要以上所有人同意
  • 驳回:当前处理人可以驳回历史走过的任何一个节点 1、驳回任意普通节点 2、驳回多实例节点 3、驳回并行网关节点 4、驳回子流程节点 5、子流程节点驳回主流程节点 实际情况中,为了获取可驳回...
  • 流程图梳理

    千次阅读 2019-04-15 11:30:00
    流程图是产品经理传达需求的常用做法,三大类:业务流程、页面流程、功能流程。分别对应着战略、战术、执行三大层次。 业务流程 体现Boss对整个产品的战略思想。产品经理根据老板的传达以及自身对产品的理解,梳理...
  • 网关用来控制流程的流向网关可以消费也可以生成token。网关显示成菱形图形,内部有有一个...流程图: 部署流程文件: //获取流程引擎 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngin...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 11,718
精华内容 4,687
关键字:

并行审批流程图