Fundamentos do fluxo de trabalho integrado do SpringBoot (1)

prefácio

Qual é o fluxo de trabalho? Nesta era de alta simultaneidade, é como um órfão abandonado. Amigos que não entendem podem ir ao processo de OA para experimentá-lo. Se você tiver a oportunidade, pode ir ao exame físico para entender o processo de design melhor. Para o mecanismo de processo, não encontrei um site público de experiência de design de processo (PS: compartilharei com você se o encontrar).

O que é Flowable

Flowable é um mecanismo de processo de negócios leve escrito em Java. O mecanismo de processo Flowable pode ser usado para implantar definições de processo BPMN 2.0 (o padrão XML da indústria para definir processos), criar instâncias de processo dessas definições de processo, realizar consultas, acessar instâncias de processo histórico ou em execução e dados relacionados e muito mais.

O Flowable pode ser adicionado ao seu aplicativo/serviço/arquitetura de forma muito flexível e também pode ser publicado como um aplicativo separado

construir projeto

Crie um projeto Springboot e adicione dependências fluidas

<dependency>
    <groupId>org.flowable</groupId>
    <artifactId>flowable-spring-boot-starter</artifactId>
    <version>6.7.2</version>
</dependency>
复制代码
Iniciar o projeto front-end

Baixe o código-fonte do front-end flowable-vue

# 克隆项目
git clone https://gitee.com/Owater/flowable-vue.git

# 进入项目目录
cd flowable-vue

# 安装依赖
npm install --registry=https://registry.npmmirror.com

# 启动服务
npm run dev
复制代码
Iniciar o código de back-end

Baixe o código de back-end

Importe sql/demo_flowable.sql no projeto e execute DemoFlowableApplication

banco de dados fluido

  • A maioria das tabelas de banco de dados do Flowable começa com ACT_. A segunda parte é um identificador de dois caracteres que descreve a finalidade da tabela. A nomenclatura da API de serviço está de acordo com essa regra.

  • ACT_RE_: 'RE' significa repositório. As tabelas com esse prefixo contêm informações "estáticas", como definições de processo e recursos de processo (imagens, regras, etc.).

  • ACT_RU_: 'RU' significa tempo de execução. Essas tabelas armazenam informações de tempo de execução, como instâncias de processo, tarefas de usuário, variáveis, trabalhos, etc. Flowable salva apenas os dados de tempo de execução enquanto a instância do processo está em execução e exclui os registros quando a instância do processo termina. Isso mantém a tabela pequena e rápida em tempo de execução.

  • ACT_HI_: 'HI' significa história. Essas tabelas armazenam dados históricos, como instâncias de processos concluídos, variáveis, tarefas, etc.

  • ACT_GE_: Dados gerais. Usado em vários lugares.

Ficha de Dados Gerais (2)
  • act_ge_bytearray:二进制数据表,如流程定义、流程模板、流程图的字节流文件;
  • act_ge_property:属性数据表(不常用);
历史表(8个,HistoryService接口操作的表)
  • act_hi_actinst:历史节点表,存放流程实例运转的各个节点信息(包含开始、结束等非任务节点);
  • act_hi_attachment:历史附件表,存放历史节点上传的附件信息(不常用);
  • act_hi_comment:历史意见表;
  • act_hi_detail:历史详情表,存储节点运转的一些信息(不常用);
  • act_hi_identitylink:历史流程人员表,存储流程各节点候选、办理人员信息,常用于查询某人或部门的已办任务;
  • act_hi_procinst:历史流程实例表,存储流程实例历史数据(包含正在运行的流程实例);
  • act_hi_taskinst:历史流程任务表,存储历史任务节点;
  • act_hi_varinst:流程历史变量表,存储流程历史节点的变量信息;
用户相关表(4个,IdentityService接口操作的表)
  • act_id_group:用户组信息表,对应节点选定候选组信息;
  • act_id_info:用户扩展信息表,存储用户扩展信息;
  • act_id_membership:用户与用户组关系表;
  • act_id_user:用户信息表,对应节点选定办理人或候选人信息;
流程定义、流程模板相关表(3个,RepositoryService接口操作的表)
  • act_re_deployment:部属信息表,存储流程定义、模板部署信息;
  • act_re_procdef:流程定义信息表,存储流程定义相关描述信息,但其真正内容存储在act_ge_bytearray表中,以字节形式存储;
  • act_re_model:流程模板信息表,存储流程模板相关描述信息,但其真正内容存储在act_ge_bytearray表中,以字节形式存储;
流程运行时表(6个,RuntimeService接口操作的表)
  • act_ru_task:运行时流程任务节点表,存储运行中流程的任务节点信息,重要,常用于查询人员或部门的待办任务时使用;
  • act_ru_event_subscr:监听信息表,不常用;
  • act_ru_execution:运行时流程执行实例表,记录运行中流程运行的各个分支信息(当没有子流程时,其数据与act_ru_task表数据是一一对应的);
  • act_ru_identitylink:运行时流程人员表,重要,常用于查询人员或部门的待办任务时使用;
  • act_ru_job:运行时定时任务数据表,存储流程的定时任务信息;
  • act_ru_variable:运行时流程变量数据表,存储运行中的流程各节点的变量信息;

动态制定流程

  1. 设计流程

screenshot.png

实现逻辑:前端vue通过bpmn组件制定流程,生成xml,提交给后端,Flowable保存xml

// 保存流程bpmn
Deployment deploy = repositoryService.createDeployment().addString("流程名称.bpmn", "流程生成的bpmn xml")
                .tenantId("租户id").name(req.getName()).category(req.getCategory()).deploy();
ProcessDefinition definition = repositoryService.createProcessDefinitionQuery().deploymentId(deploy.getId()).singleResult();
repositoryService.setProcessDefinitionCategory(definition.getId(), "流程类别");
复制代码

存储在act_re_procdef表

imagem.png

  1. 发起流程
// 查找对应的流程
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId("流程标识")
                .latestVersion().singleResult();
// 设置流程发起人Id到流程中
Map<String, Object> variables = new HashMap<>();
identityService.setAuthenticatedUserId("流程发起人ID");
variables.put(ProcessConstants.PROCESS_INITIATOR, "流程发起人ID");
runtimeService.startProcessInstanceById("流程标识", variables);
复制代码

发起流程效果图:

Iniciar efeito do processo

发起流程操作如下几张表数据:

  • ACT_HI_VARINST 存储流程历史变量表

  • ACT_HI_PROCINST 存储流程实例历史数据 imagem.png

  • ACT_HI_IDENTITYLINK 存储流程流转节点人员信息 imagem.png

  • ACT_HI_TASKINST 存储历史任务节点

  • ACT_RU_EXECUTION 存储运行中流程运行的各个分支信息

  • ACT_RU_ACTINST 存储运行中各个节点的详细信息,关联任务 imagem.png

  • ACT_RU_TASK 存储运行中流程的任务节点信息,重要,常用于查询人员或部门的待办任务时使用

  • ACT_RU_IDENTITYLINK 存储运行中人员信息,常用于查询人员或部门的待办任务时使用

  • ACT_RU_VARIABLE 存储运行中的流程各节点的变量信息

  1. 审批流程
// 查找任务
Task task = taskService.createTaskQuery().taskId("任务ID").singleResult();
// 任务增加审批意见
taskService.addComment("任务ID", "流程实例Id", FlowComment.NORMAL.getType(), "审批意见");
// 设置审批人 用户ID
taskService.setAssignee("任务ID", "审批人 用户ID");
taskService.complete("任务ID", "流程变量信息");
复制代码

审批流程操作如下几张表数据:

  • insert into ACT_HI_VARINST:存储上一个节点操作数据
  • insert into ACT_HI_IDENTITYLINK:存储上一个节点人员信息
  • insert into ACT_HI_TASKINST:存储上一个节点任务数据
  • inserir em ACT_HI_ACTINST
  • inserir em ACT_RU_ACTINST
  • inserir em ACT_RU_TASK: Inserir a próxima tarefa do nó
  • inserir em ACT_GE_BYTEARRAY
  • inserir em ACT_RU_VARIABLE
  • atualizar ACT_RU_ACTINST: É principalmente para atualizar o campo REV_, que é usado principalmente para implementar o bloqueio otimista. Consulte a explicação no seguinte artigo
  • atualizar ACT_RU_EXECUTION
  • atualizar ACT_HI_ACTINST
  • atualizar ACT_HI_TASKINST
  • excluir de ACT_RU_TASK: exclui a tarefa em execução no último nó

Processo de implementação de bloqueio otimista Activiti

  1. Processo de cancelamento

Lógica de implementação: obtenha o último nó do processo e altere o status do nó

// 获取当前流程实例
ProcessInstance processInstance = runtimeService.createProcessInstanceQuery()
        .processInstanceId(req.getInstanceId())
        .singleResult();
List<Execution> executions = runtimeService.createExecutionQuery()
                        .parentId(processInstance.getProcessInstanceId()).list();
// 所有的执行节点
List<String> executionIds = new ArrayList<>();
executions.forEach(execution -> executionIds.add(execution.getId()));

// 获取流程图
BpmnModel bpmnModel = repositoryService.getBpmnModel(processInstance.getProcessDefinitionId());
Process process = bpmnModel.getMainProcess();
// 获取当前流程最后一个节点
String endId = endNodes.get(0).getId();
// 变更流程为已结束状态
runtimeService.createChangeActivityStateBuilder()
        .moveExecutionsToSingleActivityId(executionIds, endId).changeState();
复制代码
  1. Alternativa de processo
// 查找任务
Task task = taskService.createTaskQuery().taskId("任务ID").singleResult();
// 回退操作
runtimeService.createChangeActivityStateBuilder()
            .processInstanceId(task.getProcessInstanceId())
            .moveActivityIdsToSingleActivityId("需退回任务列表", "回退到指定节点的key").changeState();
复制代码

referência

Ruoyi-flowable

estrutura de tabela de banco de dados fluida

おすすめ

転載: juejin.im/post/7222179242955751479