activiti:流程实例管理processInstance

上文链接:https://www.cnblogs.com/wangshaoyun/p/17164959.html

通过流程定义模型,进行部署流程定义,部署后会生成流程定义数据(相当于java类),此时生成的流程定义数据主要用于启动流程实例,一个流程定义 Java 类对应的可以创建无数个 java 流程实例对象。

启动流程实例

@Autowired
RuntimeService runtimeService;
​
/**
 *  涉及到的数据表
 *  ACT_HI_TASKINST 任务实例
 *  ACT_HI_PROCINST 流程实例
 *  ACT_HI_ACTINST  流程节点实例表
 *  ACT_HI_IDENTITYLINK 流程实例相关办理人
 *  ACT_RU_EXECUTION 运行时流程执行实例表
 *  ACT_RU_TASK 运行时流程任务表
 *  ACT_RU_IDENTITYLINK 运行时流程实例办理人
 */
@Test
public void startProcessInstance() {
    //流程定义唯一标识key
    String processKey = "leave";
    //业务侧id
    String businessKey = "10000";
    //启动当前流程实例的用户
    Authentication.setAuthenticatedUserId("波多野结波");
    //启动流程实例
    ProcessInstance pi = runtimeService.startProcessInstanceByKey(processKey, businessKey);
    //将流程定义名称作为流程实例名称
    runtimeService.setProcessInstanceName(pi.getProcessInstanceId(), pi.getProcessDefinitionName());
    System.out.println("流程实例启动成功:" + pi.getProcessInstanceId());
}

查询正在运行中的流程实例数据

@Autowired
RuntimeService runtimeService;
​
/** 核心表为act_ru_execution,其中PARENT_ID_为null时,就是正在运行的流程实例 */
@Test
public void getProcInstRunningList() {
    List<ProcessInstance> list = runtimeService.createProcessInstanceQuery()
            .processInstanceNameLike("%请假%")
            .list();
    for (ProcessInstance pi : list) {
        System.out.println("流程实例key:" + pi.getProcessDefinitionKey());
        System.out.println("流程实例id:" + pi.getProcessInstanceId());
        System.out.println("流程实例name:" + pi.getName());
        System.out.println("流程定义版本:" + pi.getProcessDefinitionVersion());
        System.out.println("业务测的key:" + pi.getBusinessKey());
        System.out.println("流程发起人:" + pi.getStartUserId());
        System.out.println("流程实例状态:" + (pi.isSuspended() ? "挂起" : "激活"));
    }
}

挂起或激活流程实例

@Autowired
RuntimeService runtimeService;
​
/** 主要修改的是 act_ru_execution 表的 SUSPENSION_STATE_ 字段 */
@Test
public void updateProcInstState() {
    //查询指定流程实例的数据
    String procInstId = "eaab10e3-b741-11ed-a54e-38f3abe10e1d";
    ProcessInstance processInstance = runtimeService.createProcessInstanceQuery()
            .processInstanceId(procInstId)
            .singleResult();
    //判断当前流程实例的状态
    if (processInstance.isSuspended()) {
        //挂起 -> 激活
        runtimeService.activateProcessInstanceById(procInstId);
        System.out.println("激活成功!");
    } else {
        //激活 -> 挂起
        runtimeService.suspendProcessInstanceById(procInstId);
        System.out.println("挂起成功!");
    }
}

删除流程实例

@Autowired
RuntimeService runtimeService;
@Autowired
HistoryService historyService;
​
/**
 * 涉及到的数据库表
 * ACT_RU_IDENTITYLINK
 * ACT_RU_TASK
 * ACT_RU_EXECUTION
 */
@Test
public void deleteProcInst() {
    String procInstId = "eaab10e3-b741-11ed-a54e-38f3abe10e1d";
    ProcessInstance processInstance = runtimeService.createProcessInstanceQuery()
            .processInstanceId(procInstId)
            .singleResult();
​
    if (null != processInstance) {
        runtimeService.deleteProcessInstance(procInstId,"删除原因");
        //删除流程实例相关的历史数据
        //historyService.deleteHistoricProcessInstance(procInstId);
    }
}