activiti 7 + springboot2(七) Activiti流程实例的运行过程

流程部署完成后,每启动一次流程就是一个流程实例。

 

(一)根据流程定义key启动流程实例

ProcessInstance processInstance = runtimeServic.startProcessInstanceByKey("myProcess_1");

每个执行是单独的流程实例,不同的实例之间不会相互干扰。

在任务节点表ACT_RU_TASK生成任务实例数据。

 

(二)启动流程实例的时候指定businesskey(业务标识)

//第一个参数:是指流程定义key
//第二个参数:业务标识businessKey
 ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myProcess_1", "sn001");

businesskey:业务标识,业务标识来源于业务系统。通常为业务表的主键,根据业务标识来关联查询业务系统的数据。

启动流程实例时,指定的businesskey,就会在ACT_RU_EXECUTION #流程实例的执行表中存储businesskey

 

(三)查询流程实例

 可以查看流程实例的状态,当前运行结点等信息。 

    /**
     * 查询指定流程的所有实例
     */
    @Test
    public void processInstanceQuery() {
        String processDefinitionKey = "myProcess_1";
        List<ProcessInstance> list = runtimeService.createProcessInstanceQuery().processDefinitionKey(processDefinitionKey).list();
        for (ProcessInstance instance : list) {
            System.out.println("流程实例id: " + instance.getProcessInstanceId());
            System.out.println("所属流程定义id: " + instance.getProcessDefinitionId());
            System.out.println("是否执行完成: " + instance.isEnded());
            System.out.println("是否暂停: " + instance.isSuspended());
            System.out.println(" 当 前 活 动 标 识 : " + instance.getActivityId());
        }
    }

 

(四)删除已经部署成功的流程 

    /**
     * 删除已经部署的流程定义
     * delete from ACT_RE_DEPLOYMENT 流程部署信息表;
     * ACT_RE_PROCDEF 流程定义数据表;
     * ACT_GE_BYTEARRAY 二进制数据表;
     */
    @Test
    public void deleteProcessDefinition(){
        //执行删除流程定义  参数代表流程部署的id
        repositoryService.deleteDeployment("b10a151b-3366-11ea-bc18-30b49ec7161f");
    }

 1.当我们正在执行的这一套流程没有完全审批结束的时候,此时如果要删除流程定义信息就会失败。

2.如果要求强制删除,可以使用repositoryService.deleteDeployment("myProcess_1:1:f482ce07-35bf-11ea-b325-30b49ec7161f",true);

参数true代表级联删除,此时就会先删除没有完成的流程结点,最后就可以删除流程定义信息 false的值代表不级联

 

 (五)删除流程实例

 当前流程实例没有完全结束的时候,删除流程实例就会失败

    /**
     * 删除流程实例
     */
    @Test
    public void deleteProcessInstance(){
        String processInstanceId = "80a5703b-35c0-11ea-aa1a-30b49ec7161f";

        //当前流程实例没有完全结束的时候,删除流程实例就会失败
        runtimeService.deleteProcessInstance(processInstanceId,"删除原因");
    }

 执行删除部分SQL如下  :

1。 ACT_RU_TASK 运行时任务节点表
  delete from ACT_RU_TASK where ID_ = ? and REV_ = ?  

    2。 ACT_RU_IDENTITYLINK 运行时流程人员表,主要存储任务节点与参与者的相关信息   

delete from ACT_RU_IDENTITYLINK where ID_ = ?  

   3。 ACT_RU_EXECUTION 运行时流程执行实例表 

delete from ACT_RU_EXECUTION where ID_ = ? and REV_ = ?

执行更新部分SQL如下:

   1。 ACT_HI_PROCINST 历史流程实例表  

update ACT_HI_PROCINST set PROC_DEF_ID_ = ?, START_TIME_ = ?,  END_TIME_ = ?, DURATION_ = ?, END_ACT_ID_ = ?, DELETE_REASON_ = ?  where ID_ = ?  

   2。 ACT_HI_ACTINST 历史节点表  

update ACT_HI_ACTINST set EXECUTION_ID_ = ?, ASSIGNEE_ = ?, END_TIME_   = ?, DURATION_ = ? where ID_ = ?  

   3。 ACT_HI_TASKINST 历史任务实例表   

update ACT_HI_TASKINST set EXECUTION_ID_ = ?, NAME_ = ?,   PARENT_TASK_ID_ = ?, DESCRIPTION_ = ?, OWNER_ = ?, ASSIGNEE_ = ?,   CLAIM_TIME_ = ?, END_TIME_ = ?, DURATION_ = ?, DELETE_REASON_ = ?,   TASK_DEF_KEY_ = ?, FORM_KEY_ = ?, PRIORITY_ = ?, DUE_DATE_ = ? where   ID_ = ?  

 

(六)操作流程挂起、激活

操作流程定义为挂起状态,该流程定义下边所有的流程实例全部暂停;
流程定义为挂起状态该流程定义将不允许启动新的流程实例,同时该流程定义下所有的流程实例将全部挂起暂停执行。 

    /**
     * 操作流程的挂起、激活
     */
    @Test
    public void activateProcessDefinitionById(){
        //查询流程定义对象
        ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionKey("myProcess_1").singleResult();
        //当前流程定义的实例是否都为暂停状态
        boolean suspended = processDefinition.isSuspended();

        String processDefinitionId = processDefinition.getId();

        if(suspended){
            //挂起状态则激活
            repositoryService.activateProcessDefinitionById(processDefinitionId,true,new Date());
            System.out.println("流程定义:"+processDefinitionId+"激活");
        }else{
            //激活状态则挂起
            repositoryService.suspendProcessDefinitionById(processDefinitionId,true,new Date());
            System.out.println("流程定义:"+processDefinitionId+"挂起");
        }
    }

 

(七)单个流程实例的挂起,激活 

    /**
     * 单个流程实例的挂起,激活
     */
    @Test
    public void activateProcessInstanceById(){
        //查询流程实例对象
        ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId("80a5703b-35c0-11ea-aa1a-30b49ec7161f").singleResult();

        //当前流程定义的实例是否都为暂停状态
        boolean suspended = processInstance.isSuspended();

        String processInstanceId = processInstance.getId();
        if(suspended){
            //激活
            runtimeService.activateProcessInstanceById(processInstanceId);
            System.out.println("流程:"+processInstanceId+"激活");
        }else{
            //挂起
            runtimeService.suspendProcessInstanceById(processInstanceId);
            System.out.println("流程:"+processInstanceId+"挂起");
        }
    }

 

 (八)实例任务的执行

    /**
     * 完成任务
     */
    @Test
    public void completeTask(){
        //任务ID
        String taskId = "967465fe-3367-11ea-a057-30b49ec7161f";
        taskService.complete(taskId);
        System.out.println("完成任务:任务ID:"+taskId);
    }

当流程实例的所有任务都终止后,流程实例也就结束了;

 

(九)设置流程实例的启动者

        //设置当前用户id,启动流程会读取这个信息,对应processInstance.getStartUserId()
        Authentication.setAuthenticatedUserId(String.valueOf(user.getId()));
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(pd.getKey());
System.out.println("实例Id:"+processInstance.getId());
System.out.println("StartUserId:"+processInstance.getStartUserId());

 打开act_hi_procinst表,看到该记录的START_USER_ID_字段记录了设置的用户id

 

 

 

源码下载  https://download.csdn.net/download/zsg88/12100238

 

posted @ 2020-01-13 14:06  猪脚踏浪  阅读(4135)  评论(4编辑  收藏  举报