Activitiの基本操作

package com.rainyhon;

import org.activiti.engine.HistoryService;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.history.HistoricActivityInstance;
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.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import javax.annotation.Resource;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.List;
import java.util.zip.ZipInputStream;

@SpringBootTest
class ActivitiApplicationTests {
    
    
    @Resource
    private RepositoryService repositoryService;
    @Resource
    private RuntimeService runtimeService;
    @Resource
    private HistoryService historyService;
    @Resource
    private TaskService taskService;

    //流程的部署,获取部署id,name等信息
    //用bpmn文件完成部署
    @Test
    public void createProcess1() {
    
    
        String path = "process/MyProcess.bpmn";//bpmn文件路径
        Deployment deployment = repositoryService.createDeployment()
                .addClasspathResource(path)
//                .addClasspathResource(".png")//可以部署对应的png图片
                .name("报销流程")
                .deploy();
        System.out.println("部署id:"+deployment.getId());
        System.out.println("部署名字:"+deployment.getName());
    }
    //用zip文件完成部署
    @Test
    public void createProcess2() throws Exception{
    
    
        //zip包路径
        String path = "D:\\WorkSpace\\Project\\activiti\\src\\main\\resources\\process\\MyProcess.zip";
        Deployment deployment = repositoryService.createDeployment()
                .addZipInputStream(new ZipInputStream(new FileInputStream(path)))
                .name("报销流程zip")
                .deploy();
        System.out.println("部署id:"+deployment.getId());
        System.out.println("部署名字:"+deployment.getName());
    }

    //删除单个流程(根据部署id删除)
    @Test
    public void deleteDeployment() {
    
    
        /*
        * 参数1:流程部署id
        * 参数2:流程中有流程实例在运行时,用true强制删除流程,此时流程实例全部被删除
        * */
        repositoryService.deleteDeployment("2501",true);
    }

    //删除流程实例
    @Test
    public void deleteInstance() {
    
    
        String instanceId = "5001";//流程实例id
        runtimeService.deleteProcessInstance(instanceId,"");
    }

    //流程的挂起
    @Test
    public void pauseProcess() {
    
    
        //根据流程部署id查询流程
        ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
                .deploymentId("5001")
                .singleResult();
        //获取流程定义id
        String definitionId = processDefinition.getId();
        //获取当前流程是什么状态
        boolean suspended = processDefinition.isSuspended();
        if(suspended) {
    
    //是挂起状态,则执行激活
            /*
            * 这里将流程下的所有实例全部激活
            * 参数1:流程部署id
            * */
            repositoryService.activateProcessDefinitionById(definitionId,true,null);
        }else {
    
    
            /*
             * 这里将流程下的所有实例全部挂起
             * 参数1:流程部署id
             * */
            repositoryService.suspendProcessDefinitionById(definitionId,true,null);
        }

    }

    //单个流程的挂起
    @Test
    public void pauseOne() {
    
    
        //流程实例id
        String instanceId = "65001";
        ProcessInstance processInstance = runtimeService.createProcessInstanceQuery()
                .processInstanceId(instanceId)
                .singleResult();
        //获取当前实例状态
        boolean suspended = processInstance.isSuspended();
        if(suspended) {
    
    //是挂起状态,则执行激活
            runtimeService.activateProcessInstanceById(instanceId);
        }else {
    
    
            runtimeService.suspendProcessInstanceById(instanceId);
        }

    }

    //查询部署的流程
    @Test
    public void selectProcess() {
    
    
        List<ProcessDefinition> list = repositoryService.createProcessDefinitionQuery()
                .orderByProcessDefinitionVersion()//根据什么字段进行排序
                .asc()//升序asc,降序desc
                .listPage(1, 100);//显示第1页的内容,一页显示100条
        for(ProcessDefinition processDefinition : list) {
    
    
            System.out.println("流程定义id:"+processDefinition.getId());
            System.out.println("流程名字:"+processDefinition.getName());
            System.out.println("流程部署id:"+processDefinition.getDeploymentId());
        }
    }

    //启动流程实例,获取流程定义id、流程实例的id等
    @Test
    public void startProcessInstant() {
    
    
        /*
         * 设置流程变量,key就是${assignee1},value就是要设置的变量的值
         * */
        HashMap<String, Object> map = new HashMap<>();
        map.put("assignee1","小明1号");
        map.put("assignee2","部门经理小红");
        map.put("assignee3","总经理小张");
        map.put("count","130");
        /*
        * 一般用ByKey启动流程,key一致,就会启动版本最新的流程,startProcessInstanceByKey这个方法有3个参数
        * 参数1:流程key
        * 参数2:业务表id
        * 参数3:指定流程变量map
        * */
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("key","id",map);
        System.out.println("流程定义id:"+processInstance.getProcessDefinitionId());
        System.out.println("实例id:"+processInstance.getId());
    }

    //查询用户的任务
    @Test
    public void selectTask() {
    
    
        /*
        * 查询用户任务,这里有很多种查询方式,如:根据流程实例id查询、根据用户id查询等等
        * processInstanceId("20001")是根据实例id查询
        * taskAssignee("1")是根据用户id查询
        * */
        List<Task> list = taskService.createTaskQuery().processInstanceId("85001").list();
        for(Task task : list) {
    
    
            System.out.println("流程定义id:"+task.getProcessDefinitionId());
            System.out.println("流程实例id:"+task.getProcessInstanceId());
            System.out.println("当前节点名字:"+task.getName());
            System.out.println("流程节点id:"+task.getId());
        }
    }

    //用户处理任务
    //任务审批:(我们设置了分支条件,所以在执行流程时,会自动判断是走哪个节点,不用我们管)
    @Test
    public void userTask() {
    
    
        String instance = "87502";//流程节点id
        /*
         * 设置流程变量,key就是${status},value就是要设置的变量的值
         * */
        HashMap<String, Object> map = new HashMap<>();
        map.put("status","error");
        /*
        * 通过审批,complete这个方法有两个参数
        * 参数1:流程节点id
        * 参数2:指定流程变量,用map
        * */
        taskService.complete(instance,map);
    }

    //查询流程实例历史信息
    @Test
    public void selectHistory() {
    
    
        List<HistoricActivityInstance> list = historyService.createHistoricActivityInstanceQuery()
                .orderByHistoricActivityInstanceStartTime()//排序字段
                .asc()//升序asc,降序desc
                .listPage(1, 100);//显示第1页的内容,一页显示100条
        for(HistoricActivityInstance historicActivityInstance : list) {
    
    
            System.out.println("实例id:" + historicActivityInstance.getProcessInstanceId());
            System.out.println("流程名字:"+historicActivityInstance.getActivityName());
            System.out.println("流程结束时间:"+historicActivityInstance.getEndTime());
        }
    }

    //从数据库读取bpmn和png文件到本地
    @Test
    public void readWrite() throws Exception{
    
    
        String deploymentId = "62501";//流程部署id
        String bpmnName = "process/MyProcess.bpmn";//bpmn文件的名字,数据库存的包含路径,那就这样写
        InputStream InputStream = repositoryService.getResourceAsStream(deploymentId, bpmnName);
        OutputStream outputStream = new FileOutputStream("D:\\WorkSpace\\Project\\"+bpmnName);
        byte[] bytes = new byte[1024];
        while (InputStream.read(bytes) > 0) {
    
    
            outputStream.write(bytes, 0, bytes.length);
        }
        InputStream.close();
        outputStream.close();
    }
}

おすすめ

転載: blog.csdn.net/weixin_52877849/article/details/115032659