activiti--操作例子

 

 

package com.example;

import java.io.Reader;
import java.io.StringReader;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamReader;

import org.activiti.bpmn.converter.BpmnXMLConverter;
import org.activiti.bpmn.model.BpmnModel;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngineConfiguration;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.history.HistoricVariableInstance;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.repository.ProcessDefinitionQuery;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.IdentityLink;
import org.activiti.engine.task.Task;
import org.junit.Before;
import org.junit.Test;

/**
 * 测试流程
 * @author 20150205
 *
 */
public class TestActiviti {
    
    /**
     *  RepositoryService 管理流程定义 
        RuntimeService 执行管理,包括启动、推进、删除流程实例等操作 
        TaskService 任务管理 
        HistoryService 历史管理(执行完的数据的管理) 
        IdentityService 组织机构管理 
        FormService 一个可选服务,任务表单管理 
     */
    
    /**
     * 
     */
    
    ProcessEngine processEngine = null;
    RepositoryService repositoryService = null;
    RuntimeService runtimeService = null;
    TaskService taskService = null;

    @Before
    public void init() {
        //加载spring配置文件,创建 ProcessEngine
        processEngine = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml")
                .buildProcessEngine();
        repositoryService = processEngine.getRepositoryService();
        runtimeService = processEngine.getRuntimeService();
        taskService = processEngine.getTaskService();
    }


    /**
     * 部署流程定义加载test.bpmn文件
     */
    @Test
    public void deploy(){
        Deployment deployment  = repositoryService.createDeployment()
                .addClasspathResource("diagrams/qingjia.bpmn")
                .name("请假流程")
                .category("办公类别")
                //.tenantId("租户1")
                .deploy();
        String id = deployment.getId();
        
        //级联删除,不管流程是否启动
        //repositoryService.deleteDeployment(id, true);
        
        System.out.println("***************部署流程定义完成***************" + id);
    }
    
    public void deployStr() throws Exception {
        XMLInputFactory factory = XMLInputFactory.newFactory();
        Reader reader = new StringReader("bpmnxml字符串");
        XMLStreamReader streamReader = factory.createXMLStreamReader(reader);
        BpmnXMLConverter converter = new BpmnXMLConverter();
        BpmnModel bpmnModel = converter.convertToBpmnModel(streamReader);
        Deployment deployment = repositoryService.createDeployment()//创建Deployment对象
                .name("")
                .category("")
                .tenantId("000000")
                .addBpmnModel("", bpmnModel)
                .deploy();//部署
        
        
      //字符串  
//        String text = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><definitions>...</definitions>";           
//          
//         deployment = processEngine.getRepositoryService()//获取流程定义和部署对象相关的Service  
//                        .createDeployment()//创建部署对象  
//                        .addString("helloworld.bpmn",text)                    
//                        .deploy();//完成部署  
    }
    
    @Test
    public void selectP() {
        //获取到流程查询对象
        ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();
        //查询所有流程定义
        List<ProcessDefinition> list = processDefinitionQuery.list();
        //查询所有流程定义最新的流程,最新的版本
        Map<String, ProcessDefinition> map = new LinkedHashMap<String, ProcessDefinition>();
        
        List<ProcessDefinition> list1 = repositoryService.createProcessDefinitionQuery().orderByProcessDefinitionVersion().asc().list();
        for (ProcessDefinition processDefinition : list1) {
            //留最新的key
            map.put(processDefinition.getKey(), processDefinition);
        }
        System.out.println("查询流程模板");
        
        
    }
    
    
    //查询正在执行的流程实例,判断流程是否结束
    public void selectProcessInstance() {
        ProcessInstance singleResult = runtimeService.createProcessInstanceQuery()
                .processInstanceId("processInstanceId")
                .singleResult();
        if(singleResult==null) {
            //流程已结束
        }
        
    }
    
    

    /**
     * 启动一个请假流程
     */
    @Test
    public void start() {
        for(int i = 0 ; i < 1; i++){
            //根据KEY默认安装流程版本启动流程
            String processId = runtimeService.startProcessInstanceByKey("qingjiaid").getId();
            System.out.println("***************启动第" + i + "个请假流程完成***************" + processId);
        }
        
        //流程执行对象表act_ru_execution
        //一个流程只有一个流程实例
        //多个流程对象对应一个流程示例,比如流程中有分支和聚合
        
        
    }
    
    /**
     * 设置流程变量和任务变量
     * 
     */
    
    
    @Test
    public void setVariable() {
        //runtimeService.setVariables(executionId, variables);
        //taskService.setVariables(taskId, variables);
        //启动流程时设置流程变量
        //runtimeService.startProcessInstanceByKey(processDefinitionKey, variables)
        //taskService.complete(taskId, variables);
        Map<String, Object> variables = new HashMap<String, Object>();
        //可以覆盖,覆盖修改
        variables.put("请假天数", 4);
        variables.put("请假原因","事假");
        taskService.setVariables("2504", variables);
        //存放对象时,对象必须序列化并且不能修改,否者反序列化时会出错,比如保存变量后,对象添加一个新属性,解决:必须有一个序列化版本ID
        //taskService.setVariableLocal("taskId", "variableName", new Person());
        //Local  是和任务ID关联,当前任务结束后,act_ru_variable表就不存在了,下一个任务获取不到了,历史表里有act_hi_varinst
        //taskService.setVariablesLocal(taskId, variables);
        System.out.println("设置任务变量");
        
        Map<String, Object> variables1 = taskService.getVariables("2504");
        System.out.println("获取任务变量"+variables1.toString());
        
        Map<String, Object> variables2 = runtimeService.getVariables("2501");
        System.out.println("获取流程变量"+variables2.toString());
        
        
        //历史流程变量
//        List<HistoricVariableInstance> list = processEngine.getHistoryService()//
//            .createHistoricVariableInstanceQuery() // 创建一个历史的流程变量查询对象
//            .variableName("请假天数").list();
    }
    
    //查询具体任务
    @Test
    public void selectTask() {
        List<Task> tasks = taskService.createTaskQuery().taskAssignee("张三").list();
        for (Task task : tasks) {
            System.out.println("" + task.getName() + ",id:" + task.getId());//任务的name与id
            System.out.println(task.getAssignee());//任务拥有者
            System.out.println(task.getProcessInstanceId());//流程实例id
            System.out.println(task.getProcessDefinitionId());//流程定义id
            taskService.complete(task.getId());//完成任务
        }
    }
    
    /**
     * 查询组任务
     */
    @Test
    public void selectGroupTask() {
        //act_ru_identitylink
        //TYPE_    participant个人任务,组任务
        //candidate  张三,李四
        List<Task> tasks = taskService.createTaskQuery().taskCandidateUser("张三").list();
        
        //查询正在执行任务办理人
        List<IdentityLink> IdentityLinks = taskService.getIdentityLinksForTask("taskId");
        for (IdentityLink identityLink : IdentityLinks) {
            //identityLink.getUserId()
            //identityLink.getType()
            System.out.println();
        }
        //将组任务分配给某个人(可以是组内的人,也可以不是)
        //拾取任务
        //taskService.claim("taskId", "userId");
        //将个人任务回退到组任务,前提,之前也是一个组任务
        //taskService.setAssignee("taskId", null);
        //向组任务中添加成员
        //taskService.addCandidateUser("taskId", "userId");
        //taskService.deleteCandidateUser("taskId", "userId");
    
    }


    
}

 

posted @ 2020-11-16 19:17  jentary  阅读(174)  评论(0编辑  收藏  举报