Activiti5.22&Springboot&eclipse&postgresql工作流学习---1 画流程图、实现单人任务流程

以下流程图以员工请假为例:
    大致流程:开始-->员工(zhangsan)申请休假-->由部门经理(lisi)审批-->由总经理(wangwu)审批-->结束

1 每一个流程都必须有一个开始和结束
     Activiti5.22&Springboot&eclipse&postgresql工作流学习---1 画流程图、实现单人任务流程
2 每一步都是由单个用户操作的,所以选择userTask
     Activiti5.22&Springboot&eclipse&postgresql工作流学习---1 画流程图、实现单人任务流程
3 最后使用连线连起来
     Activiti5.22&Springboot&eclipse&postgresql工作流学习---1 画流程图、实现单人任务流程

注意:
    最好设置保存文件的时候同事保存图片(window-preferences-Activiti(前期安装了activiti插件)-saveActions-勾选Create proces defi...)
         Activiti5.22&Springboot&eclipse&postgresql工作流学习---1 画流程图、实现单人任务流程
    设置每个节点的属性的时候要调出properties窗口,选中哪个节点就修改的是哪个节点的属性
        点击流程空白处则修改的是文件的属性,每一个bpmn文件都必须有id、name、namespace
             Activiti5.22&Springboot&eclipse&postgresql工作流学习---1 画流程图、实现单人任务流程
        单个节点如员工节点中General中 id一般会有默认值,name可以自定义修改
             Activiti5.22&Springboot&eclipse&postgresql工作流学习---1 画流程图、实现单人任务流程
            main config中如果是单人任务就再Assignee中填写(这里写死,可以写成动态的)
                 Activiti5.22&Springboot&eclipse&postgresql工作流学习---1 画流程图、实现单人任务流程
            其他节点的General和main config也是一样

流程图最终:

dd    Activiti5.22&Springboot&eclipse&postgresql工作流学习---1 画流程图、实现单人任务流程

bpmn文件也可以用xml打开(右键open with xml editor),里面明确表明任务属性及任务之间的关系,

    节点所在的坐标,这些属性都会存数据库中

   Activiti5.22&Springboot&eclipse&postgresql工作流学习---1 画流程图、实现单人任务流程

通过单元测试的方法实现请假流程(当然数据都是写死的目前)

   这里我用的springboot的单元测试方法,这里放一下用到的maven依赖,只是目前用到的

<properties>
        <java.version>1.8</java.version>
        <activiti.version>5.22.0</activiti.version>
        <postgresql.version>42.2.5</postgresql.version>
    </properties>

    <dependencies>
        <!-- Postgresql 数据库-->
        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <version>${postgresql.version}</version>
        </dependency>
        <!-- Activiti -->
    <dependency>
        <groupId>org.activiti</groupId>
        <artifactId>activiti-engine</artifactId>
        <version>${activiti.version}</version>
    </dependency>
    <dependency>
        <groupId>org.activiti</groupId>
        <artifactId>activiti-spring</artifactId>
        <version>${activiti.version}</version>
    </dependency>
    <dependency>
        <groupId>org.activiti</groupId>
        <artifactId>activiti-explorer</artifactId>
        <version>${activiti.version}</version>
        <exclusions>
            <exclusion>
                <artifactId>vaadin</artifactId>
                <groupId>com.vaadin</groupId>
            </exclusion>
            <exclusion>
                <artifactId>dcharts-widget</artifactId>
                <groupId>org.vaadin.addons</groupId>
            </exclusion>
            <exclusion>
                <artifactId>activiti-simple-workflow</artifactId>
                <groupId>org.activiti</groupId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.activiti</groupId>
        <artifactId>activiti-modeler</artifactId>
           <version>${activiti.version}</version>
    </dependency>
    <dependency>
        <groupId>org.activiti</groupId>
        <artifactId>activiti-diagram-rest</artifactId>
        <version>${activiti.version}</version>
    </dependency>
    <dependency>
        <groupId>org.eweb4j</groupId>
        <artifactId>fel</artifactId>
        <version>0.8</version>
    </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <!-- <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions> -->
        </dependency>
    </dependencies>

activiti工作流中 最核心的对象ProcessEngine(流程引擎),通过这个对象获取到流程中的其他对象,

   如定义对象,流程实例对象,任务对象等

   大致思路,创建流程引擎-->部署流程定义-->启动流程实例-->查询当前个人任务-->完成个人任务

    

package com.zrzrno.activiti;

import java.util.List;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngineConfiguration;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.junit.Test;
import org.springframework.boot.test.context.SpringBootTest;


@SpringBootTest
public class ActivitiApplicationTests {

    ProcessEngine engine = intProcessEngine();

    // 创建工作流引擎
    private static final ProcessEngine intProcessEngine() { // 数据库连接
        ProcessEngineConfiguration engineConfiguration = ProcessEngineConfiguration
                .createStandaloneProcessEngineConfiguration();
        engineConfiguration.setJdbcDriver("org.postgresql.Driver");
        engineConfiguration.setJdbcUrl(
                "jdbc:postgresql://localhost:5432/activiti5?useUnicode=true&characterEncoding=utf-8&useSSL=false");
        engineConfiguration.setJdbcUsername("postgres");
        engineConfiguration.setJdbcPassword("qq245700"); // 设置自动创建数据库表
        engineConfiguration.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
        ProcessEngine engine = engineConfiguration.buildProcessEngine();
        return engine;
    }

    // 部署流程定义
    @Test
    public void deployProcess() {
        Deployment deployment = engine.getRepositoryService()// 与流程定义和部署对象相关的service
                .createDeployment()// 创建一个部署对象
                .addClasspathResource("diagrams/helloworld.bpmn")// 从classpath中加载,一次只能加载一个-bpmn文件
                .addClasspathResource("diagrams/helloworld.png")// 从classpath中加载,一次只能加载一个-png文件
                .deploy();
        System.out.println("deployment:" + deployment);
    }
    
    //启动流程实例
    @Test
    public void startProcessInstance() {
        String processDefinitionKey="helloworld";//
        ProcessInstance instance=engine.getRuntimeService() //正在执行的流程实例和执行对象相关的service
                                .startProcessInstanceByKey(processDefinitionKey);//使用流程定义的key启动实例,key对应bpmn文件最外层的id的值
        System.out.println(instance.getId());//流程实例id
        System.out.println(instance.getProcessDefinitionId());//流程定义id
    }

    // 查询当前个人任务
    @Test
    public void getMyTask() {
        String assignee="zhangsan";
        List<Task> tList=engine.getTaskService()
            .createTaskQuery()
            .taskAssignee(assignee)
            .list();
        if(tList!=null && tList.size()>0) {
            for(Task task:tList){
                System.out.println("任务id:"+task.getId());
                System.out.println("任务名称:"+task.getName());
                System.out.println("流程办理人:"+task.getAssignee());
            }
        }
    }
    
    // 完成个人任务
    @Test
    public void completeMyTask() {
        String taskId="20004";
        engine.getTaskService()
        .complete(taskId);
        System.out.println("任务完成,任务id为:"+taskId);
    }
    
    
}

 一旦某个节点的个人完成了任务,那么再次查询个人任务的时候这个任务就查不到了,注意

张三完成了任务,那么张三就查询不到个人任务了,任务环节到李四那里,那么李四就可以查询到个人任务

   Activiti5.22&Springboot&eclipse&postgresql工作流学习---1 画流程图、实现单人任务流程

到最后总经理王五也完成任务

   Activiti5.22&Springboot&eclipse&postgresql工作流学习---1 画流程图、实现单人任务流程

   此时他们都不查询到个人任务了

   Activiti5.22&Springboot&eclipse&postgresql工作流学习---1 画流程图、实现单人任务流程