flowable 流程步骤

发布时间 2023-12-15 11:41:51作者: 尐海爸爸

1、创建ProcessEngine

ProcessEngineConfiguration configuration = new StandaloneProcessEngineConfiguration()
                .setJdbcUrl("jdbc:mysql://192.168.209.102:3306/flowable-demo?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true")
                .setJdbcDriver("com.mysql.cj.jdbc.Driver")
                .setJdbcUsername("root")
                .setJdbcPassword("2O18@qrv")
                // 如果数据库中的表结构不存在就新建
                .setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
        // 通过ProcessEngineConfiguration构建我们的ProcessEngine
        processEngine = configuration.buildProcessEngine();

2、发布流程

2.1、java代码

// 获取repositoryService对象
        RepositoryService repositoryService = processEngine.getRepositoryService();
        Deployment deployment = repositoryService.createDeployment()
                // 关联要部署的流程文件
                .addClasspathResource("holiday-request.bpmn20.xml")
                .name("请假流程")
                .deploy();
        log.info("deploymentId:{}", deployment.getId());
        log.info("deploymentName:{}", deployment.getName());

2.2、数据库表流向

# 1、查ACT_RE_PROCDEF表
select *
from ACT_RE_PROCDEF
where KEY_ = 'holidayRequest'
  and (
            TENANT_ID_ = ''
        or TENANT_ID_ is null
    )
  and DERIVED_FROM_ is null
  and VERSION_ = (select max(VERSION_)
                  from ACT_RE_PROCDEF
                  where KEY_ = 'holidayRequest'
                    and (
                              TENANT_ID_ = ''
                          or TENANT_ID_ is null
                      ));

# 2、查ACT_RU_TIMER_JOB表
select J.*
from ACT_RU_TIMER_JOB J
         inner join
     ACT_RE_PROCDEF P
     on J.PROC_DEF_ID_ = P.ID_
where J.HANDLER_TYPE_ = 'timer-start-event'
  and P.KEY_ = 'holidayRequest'
  and (
            P.TENANT_ID_ = ''
        or P.TENANT_ID_ is null
    );

# 3、查ACT_PROCDEF_INFO表
select *
from ACT_PROCDEF_INFO
where PROC_DEF_ID_ = 'holidayRequest:1:3';

# 4、插入数据ACT_RE_PROCDEF
insert
into ACT_RE_PROCDEF
(ID_, REV_, CATEGORY_, NAME_, KEY_, VERSION_, DEPLOYMENT_ID_, RESOURCE_NAME_, DGRM_RESOURCE_NAME_, DESCRIPTION_,
 HAS_START_FORM_KEY_, HAS_GRAPHICAL_NOTATION_, SUSPENSION_STATE_, DERIVED_FROM_, DERIVED_FROM_ROOT_, DERIVED_VERSION_,
 TENANT_ID_, ENGINE_VERSION_)
values ('holidayRequest:1:3', 1, 'http://www.flowable.org/processdef', '请假流程', 'holidayRequest', 1, '1',
        'holiday-request.bpmn20.xml', null, null, false, false, 1, null, null, 0, '', null);

# 5、插入数据ACT_GE_BYTEARRAY
insert
into ACT_GE_BYTEARRAY
    (ID_, REV_, NAME_, BYTES_, DEPLOYMENT_ID_, GENERATED_)
values ('2', 1, 'holiday-request.bpmn20.xml', 'java.io.ByteArrayInputStream@3fabf088', '1', false);

3、获取流程定义信息

3.1、java代码

// 获取查询器
        ProcessDefinitionQuery processDefinitionQuery = processEngine.getRepositoryService().createProcessDefinitionQuery();
        ProcessDefinition processDefinition = processDefinitionQuery
                // 设置需要查询流程id
                .deploymentId("1")
                // 响应一条结果
                .singleResult();

        log.info("id:{}", processDefinition.getId());
        log.info("deploymentId:{}", processDefinition.getDeploymentId());
        log.info("name:{}", processDefinition.getName());
        log.info("description:{}", processDefinition.getDescription());

3.2、数据库表流向

# 查询ACT_RE_PROCDEF
select distinct RES.*
from ACT_RE_PROCDEF RES
WHERE RES.DEPLOYMENT_ID_ = '1'
order by RES.ID_ asc;

3、删除部署的流程

3.1、java代码

RepositoryService repositoryService = processEngine.getRepositoryService();
        // 删除部署的流程,如果部署的流程启动了 就不能删除了
        repositoryService.deleteDeployment("1");
//        // 删除部署的流程,如果部署的流程启动了 也可以删除了,相关的流程任务也会被删除
//        repositoryService.deleteDeployment("1", true);

3.2、数据库表流向

# 1、查询ACT_RE_DEPLOYMENT
select *
from ACT_RE_DEPLOYMENT
where ID_ = '1';

# 2、查询 ACT_RE_PROCDEF
select distinct RES.*
from ACT_RE_PROCDEF RES
WHERE RES.DEPLOYMENT_ID_ = '1'
order by RES.ID_ asc;

# 3、查询 ACT_RE_MODEL
select distinct RES.*
from ACT_RE_MODEL RES
WHERE RES.DEPLOYMENT_ID_ = '1'
order by RES.ID_ asc;

# 4、查询 ACT_PROCDEF_INFO
select *
from ACT_PROCDEF_INFO
where PROC_DEF_ID_ = 'holidayRequest:1:3';

# 5、查询 ACT_RU_TIMER_JOB 
select J.*
from ACT_RU_TIMER_JOB J
where J.HANDLER_TYPE_ = 'timer-start-event'
  and J.PROC_DEF_ID_ = 'holidayRequest:1:3';

# 6、查询 ACT_RE_PROCDEF
select *
from ACT_RE_PROCDEF
where KEY_ = 'holidayRequest'
  and (
            TENANT_ID_ = ''
        or TENANT_ID_ is null
    )
  and DERIVED_FROM_ is null
  and VERSION_ = (select max(VERSION_)
                  from ACT_RE_PROCDEF
                  where KEY_ = 'holidayRequest'
                    and (
                              TENANT_ID_ = ''
                          or TENANT_ID_ is null
                      ));

# 7、查询 ACT_RE_PROCDEF
select distinct RES.*
from ACT_RE_PROCDEF RES
WHERE RES.KEY_ = 'holidayRequest'
  and RES.VERSION_ < 1
  and (
            RES.TENANT_ID_ = ''
        or RES.TENANT_ID_ is null
    )
order by RES.VERSION_ desc LIMIT 1
OFFSET 0;

# 8、删除ACT_GE_BYTEARRAY记录
delete
from ACT_GE_BYTEARRAY
where DEPLOYMENT_ID_ = '1';

# 9、删除ACT_RE_DEPLOYMENT记录
delete
from ACT_RE_DEPLOYMENT
where ID_ = '1';

# 10、删除ACT_RU_EVENT_SUBSCR记录
delete
from ACT_RU_EVENT_SUBSCR
where PROC_DEF_ID_ = 'holidayRequest:1:3'
  and EXECUTION_ID_ is null
  and PROC_INST_ID_ is null;

# 11、删除ACT_RU_IDENTITYLINK记录
delete
from ACT_RU_IDENTITYLINK
where PROC_DEF_ID_ = 'holidayRequest:1:3';

# 12、删除ACT_RE_PROCDEF记录
delete
from ACT_RE_PROCDEF
where DEPLOYMENT_ID_ = '1';

4、启动流程实例

4.1、java代码

// 通过RuntimeService来启动流程实例
        RuntimeService runtimeService = processEngine.getRuntimeService();
        // 构建流程变量(表单信息)
        Map<String, Object> variables = new HashMap<>();
        variables.put("employee", "张三");
        variables.put("nrOfHolidays", 3);
        variables.put("description", "请假去做大宝剑");
        // 启动流程
        ProcessInstance holidayRequest = runtimeService.startProcessInstanceByKey("holidayRequest", variables);
        log.info("holidayRequest.getId:{}", holidayRequest.getId());
        log.info("holidayRequest.getActivityId:{}", holidayRequest.getActivityId());
        log.info("holidayRequest.getProcessDefinitionKey:{}", holidayRequest.getProcessDefinitionKey());
        log.info("holidayRequest.getProcessDefinitionId:{}", holidayRequest.getProcessDefinitionId());
        log.info("holidayRequest.getProcessVariables:{}", holidayRequest.getProcessVariables());

4.2、数据库表流向

# 1、ACT_RE_PROCDEF
select *
from ACT_RE_PROCDEF
where KEY_ = 'holidayRequest'
  and (
            TENANT_ID_ = ''
        or TENANT_ID_ is null
    )
  and DERIVED_FROM_ is null
  and VERSION_ = (select max(VERSION_)
                  from ACT_RE_PROCDEF
                  where KEY_ = 'holidayRequest'
                    and (
                              TENANT_ID_ = ''
                          or TENANT_ID_ is null
                      ));

# 2、
# 2、
# 2、
# 2、
# 2、
# 2、

4、启动流程实例

4.1、java代码

RepositoryService repositoryService = processEngine.getRepositoryService();
        // 删除部署的流程,如果部署的流程启动了 就不能删除了
        repositoryService.deleteDeployment("1");
//        // 删除部署的流程,如果部署的流程启动了 也可以删除了,相关的流程任务也会被删除
//        repositoryService.deleteDeployment("1", true);

4.2、数据库表流向