Activiti7系列课程1-快速入门

摘要:本文使用的Activiti7具体版本是7.1.0.M1,springboot版本是2.1.5.RELEASE。本文重点讲解在activiti7中如何部署流程、启动流程实例,查询待办和完成任务。

项目搭建

首先,新建一个springboot项目,关于pom.xml文件内容如下:

 <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.5.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.shareniu.activiti7</groupId>
    <artifactId>activiti7</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>shareniu-activiti7</name>
    <description>activiti7</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.0.1</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!-- 阿里 druid 数据源 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.16</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.activiti.dependencies/activiti-dependencies -->
        <dependency>
            <groupId>org.activiti.dependencies</groupId>
            <artifactId>activiti-dependencies</artifactId>
            <version>7.1.0.M1</version>
            <type>pom</type>
        </dependency>

        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-spring-boot-starter</artifactId>
            <version>7.1.0.M1</version>
        </dependency>

        <!-- Activiti生成流程图 -->
        <dependency>
            <groupId>org.activiti</groupId>
            <artifactId>activiti-image-generator</artifactId>
        </dependency>


        <!-- https://mvnrepository.com/artifact/org.springframework.security/spring-security-core -->
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-core</artifactId>
            <version>5.1.5.RELEASE</version>
        </dependency>

SpringBoot启动类

springboot启动类代码如下:

/**
 * @author 分享牛
 */
@SpringBootApplication
public class ShareniuApplication {

    public static void main(String[] args) {
        SpringApplication.run(ShareniuApplication.class, args);
    }

}

数据源以及Activiti相关配置

数据源以及Activiti相关配置代码如下:

spring:
  activiti:
    db-history-used: true
    check-process-definitions: true # 自动部署验证设置:true-开启(默认)、false-关闭

  datasource:
    url: jdbc:mysql://localhost:3306/reanod_workflow?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC&nullCatalogMeansCurrent=true
    username: root
    password: 123
    driver-class-name: com.mysql.cj.jdbc.Driver
    type: com.alibaba.druid.pool.DruidDataSource

流程绘制

activiti7目前使用的Bpmn-js设计器,但是目前还没有发布正式版。activiti7流程设计器可以使用eclipse或者idea插件即可。接下来绘制一个简单的请假流程。流程图如下:

上面的流程非常简单,请假天数大于3天,总经理审批;否则分享牛审批。上图中的xml内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" id="Definitions_0cqmcxw" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="3.1.1">
  <bpmn:process id="leave" isExecutable="true">
    <bpmn:startEvent id="StartEvent_1">
      <bpmn:outgoing>SequenceFlow_1c8p9y9</bpmn:outgoing>
    </bpmn:startEvent>
    <bpmn:sequenceFlow id="SequenceFlow_1c8p9y9" sourceRef="StartEvent_1" targetRef="Task_05b1cv5" />
    <bpmn:userTask id="Task_05b1cv5" name="请假申请" camunda:assignee="zs">
      <bpmn:incoming>SequenceFlow_1c8p9y9</bpmn:incoming>
      <bpmn:outgoing>SequenceFlow_1w1yfm1</bpmn:outgoing>
    </bpmn:userTask>
    <bpmn:exclusiveGateway id="ExclusiveGateway_0vb8dq6">
      <bpmn:incoming>SequenceFlow_1w1yfm1</bpmn:incoming>
      <bpmn:outgoing>SequenceFlow_1mz7srn</bpmn:outgoing>
      <bpmn:outgoing>SequenceFlow_18xwjyq</bpmn:outgoing>
    </bpmn:exclusiveGateway>
    <bpmn:sequenceFlow id="SequenceFlow_1w1yfm1" sourceRef="Task_05b1cv5" targetRef="ExclusiveGateway_0vb8dq6" />
    <bpmn:sequenceFlow id="SequenceFlow_1mz7srn" sourceRef="ExclusiveGateway_0vb8dq6" targetRef="Task_0v74omi">
      <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">${day&gt;3}</bpmn:conditionExpression>
    </bpmn:sequenceFlow>
    <bpmn:sequenceFlow id="SequenceFlow_18xwjyq" sourceRef="ExclusiveGateway_0vb8dq6" targetRef="Task_1lupuyu">
      <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression" language="${day&#60;3}"></bpmn:conditionExpression>
    </bpmn:sequenceFlow>
    <bpmn:userTask id="Task_0v74omi" name="总经理审批" camunda:assignee="ls">
      <bpmn:incoming>SequenceFlow_1mz7srn</bpmn:incoming>
      <bpmn:outgoing>SequenceFlow_0kpiffh</bpmn:outgoing>
    </bpmn:userTask>
    <bpmn:userTask id="Task_1lupuyu" name="分享牛审批" camunda:assignee="ww">
      <bpmn:incoming>SequenceFlow_18xwjyq</bpmn:incoming>
      <bpmn:outgoing>SequenceFlow_1gxr4wh</bpmn:outgoing>
    </bpmn:userTask>
    <bpmn:endEvent id="EndEvent_1thnf0t">
      <bpmn:incoming>SequenceFlow_1gxr4wh</bpmn:incoming>
    </bpmn:endEvent>
    <bpmn:sequenceFlow id="SequenceFlow_1gxr4wh" sourceRef="Task_1lupuyu" targetRef="EndEvent_1thnf0t" />
    <bpmn:endEvent id="EndEvent_157xdub">
      <bpmn:incoming>SequenceFlow_0kpiffh</bpmn:incoming>
    </bpmn:endEvent>
    <bpmn:sequenceFlow id="SequenceFlow_0kpiffh" sourceRef="Task_0v74omi" targetRef="EndEvent_157xdub" />
  </bpmn:process>
  <bpmndi:BPMNDiagram id="BPMNDiagram_1">
    <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="leave">
      <bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" bpmnElement="StartEvent_1">
        <dc:Bounds x="156" y="186" width="36" height="36" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge id="SequenceFlow_1c8p9y9_di" bpmnElement="SequenceFlow_1c8p9y9">
        <di:waypoint x="192" y="204" />
        <di:waypoint x="242" y="204" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNShape id="UserTask_0653qr3_di" bpmnElement="Task_05b1cv5">
        <dc:Bounds x="242" y="164" width="100" height="80" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="ExclusiveGateway_0vb8dq6_di" bpmnElement="ExclusiveGateway_0vb8dq6" isMarkerVisible="true">
        <dc:Bounds x="392" y="179" width="50" height="50" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge id="SequenceFlow_1w1yfm1_di" bpmnElement="SequenceFlow_1w1yfm1">
        <di:waypoint x="342" y="204" />
        <di:waypoint x="392" y="204" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="SequenceFlow_1mz7srn_di" bpmnElement="SequenceFlow_1mz7srn">
        <di:waypoint x="417" y="179" />
        <di:waypoint x="417" y="88" />
        <di:waypoint x="473" y="88" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge id="SequenceFlow_18xwjyq_di" bpmnElement="SequenceFlow_18xwjyq">
        <di:waypoint x="417" y="229" />
        <di:waypoint x="417" y="273" />
        <di:waypoint x="473" y="273" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNShape id="UserTask_17d34ry_di" bpmnElement="Task_0v74omi">
        <dc:Bounds x="473" y="48" width="100" height="80" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="UserTask_09upgmk_di" bpmnElement="Task_1lupuyu">
        <dc:Bounds x="473" y="233" width="100" height="80" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape id="EndEvent_1thnf0t_di" bpmnElement="EndEvent_1thnf0t">
        <dc:Bounds x="604" y="255" width="36" height="36" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge id="SequenceFlow_1gxr4wh_di" bpmnElement="SequenceFlow_1gxr4wh">
        <di:waypoint x="573" y="273" />
        <di:waypoint x="604" y="273" />
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNShape id="EndEvent_157xdub_di" bpmnElement="EndEvent_157xdub">
        <dc:Bounds x="604" y="70" width="36" height="36" />
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge id="SequenceFlow_0kpiffh_di" bpmnElement="SequenceFlow_0kpiffh">
        <di:waypoint x="573" y="88" />
        <di:waypoint x="604" y="88" />
      </bpmndi:BPMNEdge>
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>
</bpmn:definitions>

部署流程

部署流程直接使用RepositoryService即可,相关代码如下:

    @Test
    public void deploy() {

        //创建一个部署对象
        DeploymentBuilder deploymentBuilder = repositoryService.createDeployment().name("分享牛请假流程");
        Deployment deployment = null;
            InputStream in = this.getClass().getClassLoader().getResourceAsStream("processes/leave.bpmn20.xml");
            deployment = repositoryService.createDeployment()
                .name("请假流程")
                //指定zip格式的文件完成部署
                .addInputStream("shareniu.bpmn",in)
                .deploy();//完成部署
    }

流程文档部署完毕之后,

会涉及到如下几张表。

  1. ACT_RE_DEPLOYMENT(部署表)
  2. ACT_RE_PROCDEF(流程定义表)
  3. ACT_GE_BYTEARRAY(资源表)
  4. ACT_GE_PROPERTY(通用属性表)
  5. ACT_RU_IDENTITYLINK(运行权限表)

启动流程

启动流程实例使用RuntimeService类。相关代码如下:

    @Test
    public void start() {

        String processDefinitionKey ="leave";//每一个流程有对应的一个key这个是某一个流程内固定的写在bpmn内的
        HashMap<String, Object> variables=new HashMap<>();

        ProcessInstance instance = runtimeService
                .startProcessInstanceByKey(processDefinitionKey,variables);

        System.out.println("流程实例ID:"+instance.getId());
        System.out.println("流程定义ID:"+instance.getProcessDefinitionId());
    }
startProcessInstanceByKey需要的参数,对应ACT_RE_PROCDEF表key_列的值。

查询待办

查询待办任务使用TaskService,相关代码如下:

    /**查询当前人的个人任务*/
    @Test
    public void findTask(){
        List<Task> list = taskService.createTaskQuery()//创建任务查询对象
                .list();
        if(list!=null && list.size()>0){
            for(Task task:list){
                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());
            }
        }
    }

上述代码执行完毕,会查询任务表ACT_RU_TASK。启动实例之后,实例直接运转到请假申请节点。接下来开始完成该任务。

完成用户任务

发布了194 篇原创文章 · 获赞 569 · 访问量 168万+

猜你喜欢

转载自blog.csdn.net/qq_30739519/article/details/91854111
今日推荐