Activiti工作流的学习

因为现在所处的公司要实现一个流程的审批,也是因为以前有过一些Activiti工作流的使用经验,所以我选择了Activiti工作流,不同的是以前是一个已有的框架,只会用一些流程的执行而不知道为什么这么用,而现在要学习怎么用,特别感谢一位大佬的博客。
https://blog.csdn.net/zjx86320/article/category/6294649

从零开始引入Activiti我是这样做的

第一步

下载Activiti工作流
官网:https://www.activiti.org/download-links
下载后目录结构如下:
Activiti工作流的学习_第1张图片

在database中找到对应数据库SQL至数据库建表,我下载的版本建了28张表。

第二步

把libs中包导至项目中(包中含el表达式会和tomcat的lib中的冲突),通过maven导入,获修改tomcat中的el表达式源码

 
        
            org.activiti
            activiti-engine
            6.0.0
            
                
                    de.odysseus.juel
                    juel-spi
                
            
        
        
            org.activiti
            activiti-spring
            6.0.0
        
        
            com.h2database
            h2
            1.3.170
            test
        

我后来采取的maven

第三步

配置activiti-context-xml文件 或 activiti-cfg-xml 文件,简单看了一下源码,中间有明确写到文件名,应该是不能用其他名字的
源码中也是有方法可以传入String来加载ProcessEngine(最核心的类)的,所有其他类基本都由它来生产。
获取的方式是

private ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

activiti-context-xml文件如下



    
 

    
    
        
        
        
        
    

    
    
        
    

    
    
        
        
        
        
        
    

    
    
        
    


下面是一些简单的测试方法,可转化为静态方法使用。

package com.cjdjyf.newssm.utils;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.apache.commons.io.FileUtils;
import org.junit.Test;

import java.io.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author : cjd
 * @description :
 * @date : 2018/5/7 21:35
 */
public class ActivitiUtil {
    private ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();


    //部署流程
    @Test
    public void deployProcessDefinition() throws FileNotFoundException {
        //获取资源路径
        String bpmn = "house_least.bpmn";
        String png = "house_least.png";

        Deployment deployment = processEngine.getRepositoryService()//获取流程定义和部署对象相关的Service
                .createDeployment()//创建部署对象
                .addInputStream("bpmn", new FileInputStream("D:/" + bpmn))
                .addInputStream(png, new FileInputStream("D:/" + png))
                .deploy();//完成部署
        System.out.println("部署ID:" + deployment.getId());//1
        System.out.println("部署时间:" + deployment.getDeploymentTime());
    }

    //开启流程
    @Test
    public void startProcessInstance() {
        Map map = new HashMap<>();
        map.put("decideType", 2);
        ProcessInstance pi = processEngine.getRuntimeService()//管理流程实例和执行对象,也就是表示正在执行的操作
                .startProcessInstanceByKey("myProcess_1", map);////按照流程定义的key启动流程实例

        System.out.println("流程实例ID:" + pi.getId());//流程实例ID:101
        System.out.println("流程实例ID:" + pi.getProcessInstanceId());//流程实例ID:101
        System.out.println("流程实例ID:" + pi.getProcessDefinitionId());//myMyHelloWorld:1:4
    }

    //查找流程
    @Test
    public void findPersonnelTaskList() {
        String assignee = "张三";//当前任务办理人
        List tasks = processEngine.getTaskService()//与任务相关的Service
                .createTaskQuery()//创建一个任务查询对象
                /*.taskAssignee(assignee)*/
                .list();
        if (tasks != null && tasks.size() > 0) {
            for (Task task : tasks) {
                System.out.println("任务ID:" + task.getId());
                System.out.println("任务的办理人:" + task.getAssignee());
                System.out.println("任务名称:" + task.getName());
                System.out.println("任务的创建时间:" + task.getCreateTime());
                System.out.println("任务ID:" + task.getId());
                System.out.println("流程实例ID:" + task.getProcessInstanceId());
                System.out.println("#####################################");
            }
        }
    }

    //完成任务
    @Test
    public void completeTask() {
        String taskID = "17506";
        processEngine.getTaskService().complete(taskID);
        System.out.println("完成任务:" + taskID);

    }

    // 查询流程定义
    @Test
    public void findProcessDifinitionList() {
        List list = processEngine.getRepositoryService()
                .createProcessDefinitionQuery()
                // 查询条件
                .processDefinitionKey("myProcess_1")// 按照流程定义的key
                // .processDefinitionId("helloworld")//按照流程定义的ID
                .orderByProcessDefinitionVersion().desc()// 排序
                // 返回结果
                // .singleResult()//返回惟一结果集
                // .count()//返回结果集数量
                // .listPage(firstResult, maxResults)
                .list();// 多个结果集

        if (list != null && list.size() > 0) {
            for (ProcessDefinition pd : list) {
                System.out.println("流程定义的ID:" + pd.getId());
                System.out.println("流程定义的名称:" + pd.getName());
                System.out.println("流程定义的Key:" + pd.getKey());
                System.out.println("流程定义的部署ID:" + pd.getDeploymentId());
                System.out.println("流程定义的资源名称:" + pd.getResourceName());
                System.out.println("流程定义的版本:" + pd.getVersion());
                System.out.println("########################################################");
            }
        }
    }

    //删除流程定义
    @Test
    public void deleteProcessDifinition() {
        //部署对象ID
        String deploymentId = "5001";
        processEngine.getRepositoryService()//获取流程定义和部署对象相关的Service
                .deleteDeployment(deploymentId, true);

        System.out.println("删除成功~~~");//使用部署ID删除流程定义,true表示级联删除
    }

    //查看流程定义的资源文件
    @Test
    public void viewPng() throws IOException {
        //部署ID
        String deploymentId = "1";
        //获取的资源名称
        List list = processEngine.getRepositoryService()
                .getDeploymentResourceNames(deploymentId);
        //获得资源名称后缀.png
        String resourceName = "";
        if (list != null && list.size() > 0) {
            for (String name : list) {
                if (name.indexOf(".png") >= 0) {//返回包含该字符串的第一个字母的索引位置
                    resourceName = name;
                }
            }
        }

        //获取输入流,输入流中存放.PNG的文件
        InputStream in = processEngine.getRepositoryService()
                .getResourceAsStream(deploymentId, resourceName);

        //将获取到的文件保存到本地
        FileUtils.copyInputStreamToFile(in, new File("E:/" + resourceName));

        System.out.println("文件保存成功!");
    }

}

你可能感兴趣的:(Java)