天天看点

activiti工作流学习笔记-2

一、绘制流程

  1、指定流程定义key值;

  流程定义key值是流程定义的标识,建议:相同的业务流程,流程定义的key名字定义一样,比如,如果需要创建新的业务流程,请假流程则使用新的key。

activiti工作流学习笔记-2

  2、指定任务负责人

activiti工作流学习笔记-2

 二、部署流程定义

  

//部署流程定义
    @Test
    public void deployProcess(){
        //获取repositoryService
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        RepositoryService repositoryService = processEngine.getRepositoryService();
        Deployment deployment = repositoryService
                .createDeployment().addClasspathResource("bpmn/example.bpmn")
                .addClasspathResource("bpmn/example.png") //通过bpmn文件生成的png文件
                .name("test").deploy();
        System.out.println("测试结果:"+deployment.getId()+"=="+deployment.getName());
    }

      
//压缩包部署方式
    @Test
    public void deployProcessByZip(){
        //创建processEngine
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //获取repositoryService
        RepositoryService repositoryService = processEngine.getRepositoryService();
        //定义输入流
        InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("bpmn/example.zip");
        ZipInputStream zipInputStream = new ZipInputStream(inputStream);
        Deployment deployment = repositoryService.createDeployment().addZipInputStream(zipInputStream).deploy();
        System.out.println("测试流程部署ID=="+deployment.getId());
        System.out.println("测试流程部署NAME=="+deployment.getName());
    }      

  流程定义部署后操作activiti数据表如下:

  SELECT * FROM act_re_deployment #流程定义部署表,记录流程部署信息

  SELECT * FROM act_re_procdef #流程定义表,记录流程定义信息

  SELECT * FROM act_ge_bytearray #资源表

  说明:

  act_re_deployment和act_re_procdef一对多关系,一次部署在流程部署表生成一条记录,但一次部署可以部署多个流程定义,每个流程定义在流程定义表生成一条记录。

  每一个流程定义在act_ge_bytearray  会存在两个资源记录,bpmn和png。

    建议:一次部署一个流程,这样部署表和流程定义表是一对一有关系,方便读取流程部署及流程定义信息。

三、查看部署的流程定义

//查看部署的流程定义
    @Test
    public void queryProcessDefinition(){
        //创建processEngine
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //获取repositoryService
        RepositoryService repositoryService = processEngine.getRepositoryService();

        ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();
        //流程定义KEY
        String key = "example";
        List<ProcessDefinition> processDefinitionList =
                processDefinitionQuery.processDefinitionKey(key).orderByProcessDefinitionVersion().desc().list();
        for(ProcessDefinition processDefinition : processDefinitionList){
            System.out.println("流程定义ID=="+processDefinition.getId());
            System.out.println("流程定义NAME=="+processDefinition.getName());
            System.out.println("流程定义部署ID=="+processDefinition.getDeploymentId());
        }
    }      

四、删除部署成功的流程定义

//删除部署成功的流程定义
    @Test
    public void deleteProcessDefinition(){
        //创建processEngine
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //获取repositoryService
        RepositoryService repositoryService = processEngine.getRepositoryService();
        //流程定义部署ID
        String deploymentId = "7501";
        //删除流程定义,如果该流程定义已有流程实例启动则删除时出错
        repositoryService.deleteDeployment(deploymentId);

        //设置true 级联删除流程定义,即使该流程有流程实例启动也可以删除,设置为false非级别删除方式
        //repositoryService.deleteDeployment(deploymentId , true);
    }      

  1) 使用repositoryService删除流程定义

  2) 如果该流程定义下没有正在运行的流程,则可以用普通删除。

  3) 如果该流程定义下存在已经运行的流程,使用普通删除报错,可用级联删除方法将流程及相关记录全部删除。项目开发中使用级联删除的情况比较多,删除操作一般只开放给超级管理员使用。

五、启动一个流程实例

//启动一个流程实例
    @Test
    public void startProcessInstance(){
        //创建processEngine
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //获取runtimeService
        RuntimeService runtimeService = processEngine.getRuntimeService();
        //根据流程定义KEY启动流程
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("example");
        System.out.println("流程定义ID=="+processInstance.getProcessDefinitionId());
        System.out.println("流程实例ID=="+processInstance.getId());
        System.out.println("流程定义NAME=="+processInstance.getName());
    }      

六、查询当前人待执行的任务

//查询当前人待执行的任务
    @Test
    public void findPersonalTaskList(){
        //创建processEngine
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //获取taskService
        TaskService taskService = processEngine.getTaskService();
        //获取当前人待执行任务列表
        List<Task> taskList = taskService.createTaskQuery().taskAssignee("park").list();
        for(Task task : taskList){
            System.out.println("测试任务ID=="+task.getId());
            System.out.println("测试任务NAME=="+task.getName());
            System.out.println("测试流程实例IDE=="+task.getProcessInstanceId());
        }
        //当前人只有单个任务时使用
        Task task = taskService.createTaskQuery().taskAssignee("park").singleResult();
        System.out.println("测试任务ID=="+task.getId());
        System.out.println("测试任务NAME=="+task.getName());
        System.out.println("测试流程实例IDE=="+task.getProcessInstanceId());
    }      

七、完成任务

//完成任务
    @Test
    public void completTask(){
        //创建processEngine
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //获取taskService
        TaskService taskService = processEngine.getTaskService();
        //完成任务
        String taskId = "12";
        taskService.complete(taskId);
    }