Uso básico do Activiti

Índice

1. Uso do Activiti

1.1, suporte a banco de dados

1.2, Ambiente de atividades

1.2.1. Apresentando dependências

1.2.2. Adicionar configuração

1.2.3, inicie o projeto

1.2.4, introdução à tabela do banco de dados

1.3, interface de serviço do serviço comum Activiti

1.4. Ferramenta de Design de Processo

1.4.1. Baixe o explorador de atividades

1.4.2. Descompacte e obtenha o pacote de implantação

1.4.3, departamento activiti-explorer.war

1.4.4. Visite o explorador de atividades

2. Operação do processo Activiti

2.1. Definição do processo

2.1.1. Criar um novo modelo

2.1.2. Nó inicial

2.1.3. Nós de tarefa

2.1.4. Nó final

2.1.5. Definir propriedades do nó

2.1.6, salve o modelo de definição de processo

2.1.7. Baixar arquivo de definição de processo

2.1.8. Baixe a imagem de definição do processo

2.1.9. Colocar arquivos de recursos no projeto

2.2. Implantação de definição de processo

2.2.1. Método de implantação de arquivo único

2.2.2. Método de implantação de pacote compactado

2.2.3. Tabela de banco de dados de operação

2.3. Inicie a instância do processo

2.4. Tarefa de consulta

2.5, processando a tarefa atual

2.6. Consultar tarefas processadas

2.7. Outras interfaces (entenda)


1. Uso do Activiti

1.1, suporte a banco de dados

Para começar, consulte: Getting Started with Activiti_Relievedz's Blog-CSDN Blog

A operação do Activiti deve ter o suporte do banco de dados, os bancos de dados suportados são: mysql, oracle, postgres, mssql, db2, h2

1.2, Ambiente de atividades

Explicamos diretamente a introdução ao Activiti no projeto atual: guigu-oa-parent

1.2.1. Apresentando dependências

<!--引入activiti的springboot启动器 --> 
<dependency> 
    <groupId>org.activiti</groupId> 
    <artifactId>activiti-spring-boot-starter</artifactId> 
    <version>7.1.0.M6</ versão> 
    <exclusions> 
        <exclusion> 
            <artifactId>mybatis</artifactId> 
            <groupId>org.mybatis</groupId> 
        </exclusion> 
    </exclusions> 
</dependency>

Descrição: Após a integração de Activiti7 e SpringBoot, o framework de segurança SpringSecurity é integrado por padrão. Atualmente, nosso projeto possui SpringSecurity integrado. Ao definir o aprovador em casos subsequentes, ele deve ser um usuário do sistema. O framework Activiti verificará se o usuário existe, caso contrário, ocorrerá uma exceção Acompanhamento Você pode testá-lo no caso.

1.2.2. Adicionar configuração

O projeto da fonte de dados foi adicionado, só precisa da seguinte configuração

spring:     
    activiti: 
      # false: Por padrão, a tabela do banco de dados permanece inalterada, mas se a versão estiver errada ou a tabela estiver ausente, uma exceção será lançada (uso em produção) # true: a tabela não 
      existe, ela será criada automaticamente (uso de desenvolvimento) 
      # create_drop: criado na inicialização, fechado Excluir a tabela no momento (uso de teste) 
      # drop_create: excluir a tabela na inicialização e criar a tabela (sem necessidade de desligar manualmente o mecanismo) 
      database-schema-update : true 
      #Monitora se a tabela de histórico existe, Activities7 não abre a tabela de histórico por padrão 
      db-history-used : true 
      #none: Não salva nenhum dado histórico, que é o mais eficiente no processo 
      #activity: salva apenas o instância do processo e comportamento do processo 
      #audit: salva todas as tarefas do processo e suas propriedades além da atividade, audit é o valor padrão do histórico 
      # full: além da auditoria, também salva todos os outros dados detalhados relacionados ao processo, incluindo alguns processos parâmetros 
      histórico-nível: completo 
      #Verifique o arquivo do processo, verifique o arquivo do processo da pasta do processo em recursos por padrão 
      check-process-definitions: true

1.2.3, inicie o projeto

Inicie o projeto para gerar a tabela de banco de dados do projeto

1.2.4, introdução à tabela do banco de dados

O suporte à operação do Activiti deve ter o suporte dessas 25 tabelas, principalmente para registrar os sujeitos do usuário que participam do processo, informações do grupo de usuários, definição do processo, informações da execução do processo, informações históricas do processo durante a operação do processo de negócios, etc.

1. Regras e funções de nomenclatura de tabelas

Observando as tabelas criadas, verificamos que todas as tabelas do Activiti começam com act_, seguido de um identificador de duas letras indicando a finalidade da tabela, que também corresponde à API do serviço fornecido pelo Activiti:

  • ACT_RE: RE significa repositório, a tabela de prefixos contém a definição do processo e os recursos estáticos do processo (imagens, regras, etc.)

  • ACT_RU: RU representa o tempo de execução.Quando essas tabelas estiverem em execução, elas conterão dados em andamento, como instâncias de processos, tarefas, variáveis ​​e tarefas assíncronas. O Activiti salva esses dados apenas durante a execução da instância do processo e exclui esses registros ao final do processo. Desta forma, a mesa pode ser sempre mantida pequena e rápida

  • ACT_HI: HI significa histórico, essas tabelas contém alguns dados históricos, como histórico de instâncias de processos, variáveis, tarefas, etc.

  • ACT_GE: GE significa geral, dados gerais

2. Introdução à tabela de dados Activiti

tabela de classificação Nome da tabela explicar
dados gerais
[ACT_GE_BYTEARRAY] Definições genéricas de processo e recursos de processo
[ACT_GE_PROPERTY] propriedades relacionadas ao sistema
Histórico do processo
[ACT_HI_ACTINST] Exemplos de processos históricos
[ACT_HI_ATTACHMENT] Anexos do Processo Histórico
[ACT_HI_COMMENT] informação descritiva histórica
[ACT_HI_DETAIL] Informações detalhadas sobre as execuções históricas do processo
[ACT_HI_IDENTITYLINK] Relacionamento com o usuário durante a execução do processo histórico
[ACT_HI_PROCINST] Exemplos de processos históricos
[ACT_HI_TASKINST] Exemplos de tarefas históricas
[ACT_HI_VARINST] Informações variáveis ​​no histórico do processo em execução
Tabela de definição de processo
[ACT_RE_DEPLOYMENT] Informações da unidade de implantação
[ACT_RE_MODEL] informações do modelo
[ACT_RE_PROCDEF] Definição de processo implantado
executar tabela de instância
[ACT_RU_EVENT_SUBSCR] eventos de tempo de execução
[ACT_RU_EXECUTION] Instância de execução do processo de tempo de execução
[ACT_RU_IDENTITYLINK] Informações de relacionamento do usuário em tempo de execução, armazenando informações sobre nós de tarefas e participantes
[ACT_RU_JOB] trabalho em tempo de execução
[ACT_RU_TASK] tarefa de tempo de execução
[ACT_RU_VARIABLE] tabela de variáveis ​​de tempo de execução

1.3, interface de serviço do serviço comum Activiti

Apresente resumidamente as classes de implementação de cada Serviço:

  • RepositoryService

    A classe de gerenciamento de recursos do Activiti, que é responsável por implantar definições de processo e gerenciar recursos de processo. Ao usar o Activiti, a implantação do processo precisa ser concluída primeiro e o fluxograma de negócios projetado pela ferramenta de modelagem será implantado por meio do RepositoryService

  • RuntimeService

    A classe de gerenciamento de operação de processo do Activiti é usada para iniciar uma nova instância de processo e obter informações relevantes sobre a execução do processo. A definição do processo é usada para determinar a estrutura e o comportamento de cada nó em um processo, e a instância do processo é uma execução da definição do processo correspondente, que pode ser entendida como o relacionamento entre classes e objetos em Java

  • TarefaServiço

    A classe de gerenciamento de tarefas do Activiti é usada para lidar com várias tarefas em operações comerciais, como consultar tarefas atribuídas a usuários ou grupos, criar novas tarefas, atribuir tarefas, determinar e concluir uma tarefa

  • HistóricoServiço

    A classe de gerenciamento de histórico do Activiti pode consultar informações históricas. Ao executar um processo, o mecanismo salvará muitos dados, como o horário de início da instância do processo, os participantes da tarefa, o tempo para concluir a tarefa, o caminho de execução de cada instância do processo e assim por diante. Este serviço obtém esses dados principalmente por meio da função de consulta

  • Serviço de Gerenciamento

    A classe de gerenciamento de mecanismo do Activiti fornece funções de gerenciamento e manutenção para o mecanismo de processo Activiti. Essas funções não são usadas em aplicativos orientados a fluxo de trabalho e são usadas principalmente para manutenção diária do sistema Activiti

1.4. Ferramenta de Design de Processo

A versão IDEA é menor ou igual a 2019, e o plug-in Activiti actiBPM pode ser usado. IDEA maior que esta versão pode usar o plug-in visualizador Activiti BPMN para desenhar o design do processo.

Hoje nosso protagonista é: Activiti Modeler

O Activiti Modeler é um plug-in front-end para design de processo online fornecido oficialmente pela Activiti. Os desenvolvedores podem facilmente projetar processos online, salvar modelos de processo, implantar em definições de processo, etc. Nossos projetos subsequentes também integram o Activiti Modeler para desenhar definições de processo.

1.4.1. Baixe o explorador de atividades

Download do site oficial: Comece | Activiti

1.4.2. Descompacte e obtenha o pacote de implantação

Descompacte activiti-5.22.0.zip e obtenha activiti-explorer.war no diretório activiti-5.22.0\wars

1.4.3, departamento activiti-explorer.war

Coloque activiti-explorer.war no diretório de implantação do tomcat e inicie o tomcat

Caminho de inicialização: clique duas vezes em startup.bat

1.4.4. Visite o explorador de atividades

http://localhost:8080/activiti-explorer

Conta de login padrão: kermit kermit

Existem muitas funções acima, só precisamos prestar atenção ao design do processo, conforme mostrado na figura abaixo:

Clique na imagem acima: Processo --> Novo Modelo --> Digite o nome do modelo (sair) --> Criar

2. Operação do processo Activiti

2.1. Definição do processo

Definimos um processo de licença

2.1.1. Criar um novo modelo

2.1.2. Nó inicial

2.1.3. Nós de tarefa

2.1.4. Nó final

2.1.5. Definir propriedades do nó

Especifique o nome do rótulo: Zhang San Approval, líder da tarefa do nó: zhangsan

 

 Especifique o nome do rótulo: Lisi Approval, o líder da tarefa do nó: lisi

2.1.6, salve o modelo de definição de processo

2.1.7. Baixar arquivo de definição de processo

 O arquivo para download é: qingjia.bpmn20.xml

2.1.8. Baixe a imagem de definição do processo

Clique com o botão direito na imagem acima, salve a imagem como: qingjia.png

2.1.9. Colocar arquivos de recursos no projeto

Crie uma nova pasta de recursos de processo nos recursos do módulo service-oa

Coloque qingjia.bpmn20.xml e qingjia.png no diretório do processo

2.2. Implantação de definição de processo

A implantação do processo definido acima no designer no banco de dados activiti é a implantação da definição do processo. Adicione e implemente os arquivos bpmn e png da definição de processo para activiti um por um chamando a API de activiti ou compacte os dois arquivos em um pacote zip para implementação.

2.2.1. Método de implantação de arquivo único

pacote com.atguigu.auth.activiti; 

import org.activiti.engine.RepositoryService; 
import org.activiti.engine.repository.Deployment; 
import org.junit.jupiter.api.Test; 
import org.springframework.beans.factory.annotation .Autowired; 
import org.springframework.boot.test.context.SpringBootTest; 

/** 
 * @program: guigu-oa-perent 
 * @description: Definição do processo 
 * @autor: Mr.Zhang 
 * @create: 2023-04-20 09:50 
 **/ 
@SpringBootTest 
public class ProcessTest { 

    //Inject RepositoryService 
    @Autowired 
    private RepositoryService repositoryService; 

    /** 
     * Método de implantação de arquivo único 
     */ 
    @Test
    public void deployProcess() { 
        //Processo de implantação 
        Implantação deploy = repositoryService.createDeployment() 
                .addClasspathResource("process/qingjia.bpmn20.xml") 
                .addClasspathResource("process/qingjia.png") 
                .name("Sair do processo de aplicação" ) 
                .deploy(); 
        System.out.println(deploy.getId()); 
        System.out.println(deploy.getName()); 
    } 
}

Se um erro for relatado e a imagem não puder ser encontrada, adicione-a ao pom:

<include>**/*.png</include>

sucesso:

 

2.2.2. Método de implantação de pacote compactado

/** 
 * Método de implantação do pacote zip 
 */ 
@Test 
public void deployProcessByZip() { 
    // Definir fluxo de entrada zip 
    InputStream inputStream = this 
            .getClass() 
            .getClassLoader() 
            .getResourceAsStream( 
                    "process/qingjia.zip"); 
    ZipInputStream zipInputStream = new ZipInputStream(inputStream); 

    // 
    Implantação do processo Implantação da implantação = repositoryService.createDeployment() 
            .addZipInputStream(zipInputStream) 
            .name("Sair do processo de aplicação") 
            .deploy(); 
    System.out.println("Id da implantação do processo:" + deployment.getId()); 
    System.out.println("Nome da implantação do processo: " + deployment.getName());
}

2.2.3. Tabela de banco de dados de operação

As três tabelas para atividades operacionais após a implantação da definição do processo são as seguintes:

O processo act_re_deployment define a tabela de implantação, adicionando um registro para cada implantação

tabela de definição de processo act_re_procdef, implantar cada nova definição de processo adicionará um registro a esta tabela

tabela de recursos do processo act_ge_bytearray

2.3. Inicie a instância do processo

Definição de processo: coloque o arquivo bpmn nas três tabelas de atividades, como uma instância de processo de classe em java: como um objeto de instância em java (uma definição de processo pode corresponder a várias instâncias de processo), Zhang San pode iniciar um processo de saída Exemplo, Li Si também pode iniciar uma instância de processo de saída, eles não afetam um ao outro

@Autowired 
private RuntimeService runtimeService; 

@Test 
public void startUpProcess() { 
    //Para criar uma instância do processo, precisamos saber a chave da definição do processo 
    ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("qingjia"); 
    //Enviar as informações relevantes da instância 
    System.out. println("ID da definição do processo: " + processInstance.getProcessDefinitionId()); 
    System.out.println("ID da instância do processo: " + processInstance.getId()); 
    System.out.println(" Id da atividade atual: " + processInstance .getActivityId()); 
}

Ficha de Dados Operacionais

histórico de execução da instância do processo act_hi_actinst

Act_hi_identitylink processa informações do histórico do usuário participante

act_hi_procinst informações históricas da instância do processo

act_hi_taskinst processa informações do histórico de tarefas

informações de execução do processo act_ru_execution

Informações do usuário participante do processo act_ru_identitylink

informações da tarefa act_ru_task

2.4. Tarefa de consulta

Cada nó é configurado com o Assignee, após o início do processo, o responsável pela tarefa pode consultar as tarefas que precisa processar no momento, sendo que as tarefas consultadas são todas pendências do usuário.

@Autowired 
private TaskService taskService; 
​/
** 
 * Consulta as tarefas a serem executadas pelo indivíduo atual 
 */ 
@Test 
public void findPendingTaskList() { 
    //Task leader 
    String assignee = "zhangsan"; 
    List<Task> list = taskService. createTaskQuery( ) 
            .taskAssignee(assignee)//Somente consulta as tarefas do responsável pela 
            task.list(); 
    for (Task task : list) { 
        System.out.println("Id da instância do processo: " + task. getProcessInstanceId()); 
        System .out.println("ID da tarefa: " + task.getId()); 
        System.out.println("Proprietário da tarefa: " + task.getAssignee()); 
        System.out.println(" Nome da tarefa: " + task. getName()); 
    } 
}

ilustrar:

ID da instância do processo: Existe apenas um processo, que identifica o processo

ID da tarefa: Sempre que o processo atingir um determinado nó, um ID de tarefa será atribuído a esse nó

A saída é a seguinte:

ID da instância do processo: d969f534-825e-11ed-95b4-7c57581a7819 ​ ID da tarefa: d96c3f28-825e-11ed-95b4-7c57581a7819 ​ Líder da tarefa: zhangsan ​ Nome da tarefa: Aprovação por Zhang San

2.5, processando a tarefa atual

O líder da tarefa consulta as tarefas pendentes, seleciona as tarefas a serem processadas e as conclui.

/** 
 * Concluir a tarefa 
 */ 
@Test 
public void completTask(){ 
    Task task = taskService.createTaskQuery() 
            .taskAssignee("zhangsan") //A pessoa responsável a ser consultada.singleResult 
            ();//Retorna um pedaço 
//
    Conclua a tarefa, parâmetro: id da tarefa 
    taskService.complete(task.getId()); 
}

Depois que a tarefa é concluída, a tarefa vai automaticamente para o próximo nó

2.6. Consultar tarefas processadas

getNome()); 
    } 
}

2.7. Outras interfaces (entenda)

/** 
 * Definição do processo de consulta 
 */ 
@Test 
public void findProcessDefinitionList(){ 
    List<ProcessDefinition> definitionList = repositoryService.createProcessDefinitionQuery() 
            .orderByProcessDefinitionVersion() 
            .desc() 
            .list(); 
    //Informações de definição do processo de saída 
    para (ProcessDefinition processDefinition: definitionList) { 
        System.out.println("id da definição do processo="+processDefinition.getId()); 
        System.out.println("nome da definição do processo="+processDefinition.getName()); 
        System.out.println ("chave de definição de processo="+processDefinition.getKey()); 
        System.out.println("versão de definição de processo="+processDefinition.getVersion());
        System.out.println("ID de implantação do processo ="+processDefinition.getDeploymentId()); } } 
    ​/ 
** 
*
 
 Excluir definição do processo 
 */ 
public void deleteDeployment() { 
    //Id da implantação 
    String deploymentId = "82e3bc6b-81da- 11ed-8e03-7c57581a7819"; 
    //Excluir uma definição de processo, se a definição de processo já tiver uma instância de processo iniciada, ocorrerá um erro ao excluir 
    repositoryService.deleteDeployment(deploymentId); 
    //Defina true para excluir em cascata a definição de processo, mesmo se o processo tiver uma instância de processo iniciada Ela também pode ser excluída, definida como falsa exclusão sem nível 
    //repositoryService.deleteDeployment(deploymentId, true); 
}

Acho que você gosta

Origin blog.csdn.net/Relievedz/article/details/130244209
Recomendado
Clasificación