¡El tutorial de aprendizaje de Activiti más completo de la historia y el motor de flujo de trabajo más potente en un solo artículo!

1. Introducción al flujo de trabajo

1.1 Concepto

Workflow consiste en automatizar la gestión de procesos de negocio a través de ordenadores. Resuelve principalmente "el proceso de transferencia automática de documentos, información o tareas entre múltiples participantes de acuerdo con algunas reglas predefinidas, para lograr un determinado objetivo comercial esperado o promover la realización de este objetivo".

1.2 Sistema de flujo de trabajo

Un sistema de software tiene la función de flujo de trabajo, lo llamamos sistema de flujo de trabajo, ¿cuál es la función de flujo de trabajo en un sistema? Es para automatizar la gestión del proceso comercial del sistema, por lo que el flujo de trabajo se basa en el proceso comercial, por lo que el núcleo de un sistema de software es básicamente el proceso comercial del sistema, y ​​el flujo de trabajo es solo para ayudar en la gestión. del proceso de negocio. Incluso si no hay un sistema comercial de flujo de trabajo, se puede desarrollar y ejecutar, pero con el flujo de trabajo, los procesos comerciales se pueden administrar mejor y se puede mejorar la escalabilidad del sistema.

1.3 Industrias aplicables

Industria de bienes de consumo, industria manufacturera, industria de servicios de telecomunicaciones, industria de servicios financieros como seguros de valores bancarios, industria de servicios de logística, industria de servicios inmobiliarios, administración de propiedades, empresas comerciales de importación y exportación grandes y medianas, instituciones gubernamentales, institutos de investigación y servicios educativos Industrias, etc., especialmente Es una gran empresa multinacional y una empresa del grupo.

1.4 aplicación específica

1. Procesos comerciales clave: pedidos, procesamiento de cotizaciones, revisión de contratos, procesamiento de llamadas de clientes, gestión de la cadena de suministro, etc.

2. Gestión administrativa: solicitudes de viajes de negocios, solicitudes de horas extras, solicitudes de licencias, solicitudes de automóviles, solicitudes de suministros de oficina varios, solicitudes de compras, informes diarios y semanales, etc. Todos los formularios administrativos que originalmente se procesaban manualmente.

3. Gestión de personal: arreglo de capacitación de empleados, evaluación del desempeño, procesamiento de cambios de trabajo, gestión de información de archivos de empleados, etc.

4. Categorías financieras relacionadas: solicitud de pago, procesamiento de cuentas por cobrar, procesamiento de reembolso diario, reembolso de viaje de negocios, solicitud de presupuesto y plan, etc.

5. Categoría de servicio al cliente: gestión de la información del cliente, quejas de los clientes, procesamiento de solicitudes, gestión del servicio postventa, etc.

6. Categorías de servicios especiales: los procesos correspondientes de la serie ISO, los procesos correspondientes de gestión de calidad, la gestión de información de datos de productos, el procesamiento de declaraciones de aduanas para empresas comerciales, el procesamiento de seguimiento de carga para empresas de logística, etc., pueden estandarizarse automáticamente mediante software de flujo de trabajo para varias tareas que son completado de forma gradual y manual a través de formularios.

1.5 Implementación

Antes de que existiera un motor de flujo de trabajo dedicado, para lograr el control del proceso, generalmente usábamos el valor del campo de estado para rastrear el cambio del proceso. De esta forma, los usuarios con diferentes roles deciden si mostrar el registro a través del valor del campo de estado.

Para los registros que se pueden ver con permiso, el usuario actual decide si aprueba la operación calificada según su rol. Si califica, establezca un valor en el campo de estado para representar calificado; por supuesto, si no calificado, también se debe establecer un valor para representar no calificado.

Esta es la forma más primitiva. Si bien el control del proceso se logra a través del campo de estado, cuando nuestro proceso cambia, el código escrito de esta manera también debe ajustarse.

Entonces, ¿existe una forma profesional de lograr la gestión del flujo de trabajo? Y se puede lograr que después de que cambie el proceso comercial, nuestro programa no necesite cambiarse.Si se puede lograr este efecto, entonces la adaptabilidad de nuestro sistema comercial mejorará en gran medida.

Recomiende el tutorial más completo de código abierto y gratuito de Spring Boot:

https://github.com/javastacks/spring-boot-best-practice

2. Resumen de Activiti7

2.1 Introducción

Alfresco Software anunció el lanzamiento oficial del proyecto de código abierto de gestión de procesos empresariales (BPM) Activiti el 17 de mayo de 2010. Su arquitecto principal es Tom Baeyens, experto en gestión de procesos empresariales BPM Tom Baeyens es el arquitecto del jbpm original, y jbpm es un motor de flujo de trabajo muy famoso, por supuesto, activiti también es un motor de flujo de trabajo.

Activiti es un motor de flujo de trabajo. Activiti puede extraer los procesos comerciales complejos en el sistema comercial y definirlos utilizando el lenguaje de modelado especial BPMN2.0. Los procesos comerciales se ejecutan de acuerdo con los procesos predefinidos, y Activiti implementa los procesos del sistema. , reduciendo la carga de trabajo de los sistemas comerciales para la actualización y transformación del sistema debido a cambios en el proceso, mejorando así la solidez del sistema y reduciendo los costos de desarrollo y mantenimiento del sistema.

Sitio web oficial: https://www.activiti.org/

Versión experimentada:

La última versión: Activiti7.0.0.Beta

2.1.1 RPM

BPM (Business Process Management), es decir, la gestión de procesos comerciales, es una construcción estandarizada de procesos comerciales de extremo a extremo para mejorar continuamente la eficiencia empresarial de la organización. BPM está incluido en la educación de gestión empresarial común, como EMBA y MBA.

2.1.2 Software BPM

El software BPM es una herramienta de TI que promueve la integración y el ajuste de métodos y soluciones comerciales entre personas, entre personas y sistemas, y entre sistemas de acuerdo con los cambios en el entorno comercial de la empresa.

El modelado, la automatización, el control de la gestión y la optimización de todo el ciclo de vida de los procesos comerciales internos y externos de la empresa a través del software BPM pueden reducir el costo de la empresa y aumentar considerablemente las ganancias.

El software BPM es ampliamente utilizado en las empresas.Dondequiera que haya procesos comerciales, el software BPM se puede utilizar para la gestión, como la gestión de la oficina de personal de la empresa, la gestión del proceso de adquisición, la gestión del proceso de aprobación de documentos oficiales, la gestión financiera, etc.

2.1.3 BPMN

BPMN (Modelo y notación de procesos comerciales): el modelo y la notación de procesos comerciales es un conjunto de notaciones de modelado de procesos comerciales estándar desarrolladas por BPMI (Iniciativa de gestión de procesos comerciales), y los procesos comerciales se pueden crear utilizando las notaciones proporcionadas por BPMN.

La especificación BPMN1.0 se publicó en mayo de 2004. BPMI se incorporó a la organización OMG (The Object Management Group) en septiembre de 2005. OMG lanzó la versión final de BPMN2.0 en enero de 2011.

El historial de desarrollo específico es el siguiente:

BPMN es actualmente un estándar de BPM ampliamente aceptado por varios proveedores de BPM. Activiti utiliza BPMN 2.0 para el modelado de procesos y la gestión de ejecución de procesos e incluye muchos símbolos de modelado, como: Evento

Representado por un círculo, es algo que sucede durante la ejecución del proceso.

Las actividades se representan mediante rectángulos redondeados y un proceso consta de una o varias actividades.

El gráfico Bpmn en realidad representa el proceso comercial a través de xml, y el archivo .bpmn anterior se abre con un editor de texto:

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/test">
  <process id="myProcess" name="My process" isExecutable="true">
    <startEvent id="startevent1" name="Start"></startEvent>
    <userTask id="usertask1" name="创建请假单"></userTask>
    <sequenceFlow id="flow1" sourceRef="startevent1" targetRef="usertask1"></sequenceFlow>
    <userTask id="usertask2" name="部门经理审核"></userTask>
    <sequenceFlow id="flow2" sourceRef="usertask1" targetRef="usertask2"></sequenceFlow>
    <userTask id="usertask3" name="人事复核"></userTask>
    <sequenceFlow id="flow3" sourceRef="usertask2" targetRef="usertask3"></sequenceFlow>
    <endEvent id="endevent1" name="End"></endEvent>
    <sequenceFlow id="flow4" sourceRef="usertask3" targetRef="endevent1"></sequenceFlow>
  </process>
  <bpmndi:BPMNDiagram id="BPMNDiagram_myProcess">
    <bpmndi:BPMNPlane bpmnElement="myProcess" id="BPMNPlane_myProcess">
      <bpmndi:BPMNShape bpmnElement="startevent1" id="BPMNShape_startevent1">
        <omgdc:Bounds height="35.0" width="35.0" x="130.0" y="160.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="usertask1" id="BPMNShape_usertask1">
        <omgdc:Bounds height="55.0" width="105.0" x="210.0" y="150.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="usertask2" id="BPMNShape_usertask2">
        <omgdc:Bounds height="55.0" width="105.0" x="360.0" y="150.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="usertask3" id="BPMNShape_usertask3">
        <omgdc:Bounds height="55.0" width="105.0" x="510.0" y="150.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNShape bpmnElement="endevent1" id="BPMNShape_endevent1">
        <omgdc:Bounds height="35.0" width="35.0" x="660.0" y="160.0"></omgdc:Bounds>
      </bpmndi:BPMNShape>
      <bpmndi:BPMNEdge bpmnElement="flow1" id="BPMNEdge_flow1">
        <omgdi:waypoint x="165.0" y="177.0"></omgdi:waypoint>
        <omgdi:waypoint x="210.0" y="177.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="flow2" id="BPMNEdge_flow2">
        <omgdi:waypoint x="315.0" y="177.0"></omgdi:waypoint>
        <omgdi:waypoint x="360.0" y="177.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="flow3" id="BPMNEdge_flow3">
        <omgdi:waypoint x="465.0" y="177.0"></omgdi:waypoint>
        <omgdi:waypoint x="510.0" y="177.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
      <bpmndi:BPMNEdge bpmnElement="flow4" id="BPMNEdge_flow4">
        <omgdi:waypoint x="615.0" y="177.0"></omgdi:waypoint>
        <omgdi:waypoint x="660.0" y="177.0"></omgdi:waypoint>
      </bpmndi:BPMNEdge>
    </bpmndi:BPMNPlane>
  </bpmndi:BPMNDiagram>
</definitions>

2.2 Pasos para usar

desplegar actividades

Activiti es un motor de flujo de trabajo (de hecho, es un conjunto de API de paquetes jar). El sistema comercial puede acceder (operar) la interfaz de activiti para operar convenientemente los datos relacionados con el proceso, de modo que el entorno de flujo de trabajo se pueda integrar con el entorno. del sistema empresarial. .

definición de proceso

Utilice la herramienta de modelado de procesos activiti (diseñador de actividades) para definir procesos comerciales (archivos .bpmn).

El archivo .bpmn es el archivo de definición de procesos comerciales, que define el proceso comercial a través de xml.

Despliegue de definición de proceso

activiti implementa definiciones de procesos comerciales (archivos .bpmn).

Use la API proporcionada por activiti para almacenar el contenido de la definición del proceso y puede consultar el contenido definido durante la ejecución de Activiti

Activiti ejecuta y almacena el contenido de la definición del proceso en la base de datos

Iniciar una instancia de proceso

La instancia de proceso también se llama: ProcessInstance

Iniciar una instancia de proceso significa iniciar la operación de un proceso de negocio.

Una vez completada la implementación de la definición del proceso de licencia del empleado, si Zhang San desea solicitar una licencia, puede iniciar una instancia de proceso, y si Li Si desea solicitar una licencia, también puede iniciar una instancia de proceso y la ejecución de los dos procesos no se afectan entre sí.

Tareas pendientes de consulta de usuario (Tarea)

Debido a que el proceso de negocio del sistema ha sido entregado a activiti para su administración, a través de activiti, puede consultar dónde se ejecuta el proceso actual y qué tareas debe manejar el usuario actual. Estas actividades nos ayudan a administrarlas, sin necesidad de desarrolladores para escribir consultas en sentencias sql.

El usuario maneja las tareas

Después de que el usuario consulta las tareas pendientes, puede manejar una determinada tarea. Si la tarea se completa, otros usuarios deben manejarla. Por ejemplo, después de que se crea la orden de compra, el gerente del departamento la revisará. Este proceso es también completado por activiti para nosotros.

fin del proceso

Cuando se completa la tarea y no hay un nodo de tarea siguiente, la instancia de proceso se completa.

Tres, entorno Activiti

3.1 Entorno de desarrollo

  • Jdk1.8 o superior
  • Mysql 5 y superior
  • Tomcat8.5
  • IDEA

Nota: el complemento de la herramienta de definición de procesos de activiti se puede instalar en la herramienta IDEA o Eclipse

3.2 Entorno de actividad

Usamos: Activiti7.0.0.Beta1spring5 es compatible de forma predeterminada.

Recomiende el tutorial más completo de código abierto y gratuito de Spring Boot:

https://github.com/javastacks/spring-boot-best-practice

3.2.1 Descargar actividad7

Dirección de descarga de Activiti: http://activiti.org/download.html, las dependencias de Maven son las siguientes:

<dependencyManagement>
   <dependencies>
       <dependency>
           <groupId>org.activiti</groupId>
           <artifactId>activiti-dependencies</artifactId>
           <version>7.0.0.Beta1</version>
           <scope>import</scope>
           <type>pom</type>
       </dependency>
   </dependencies>
</dependencyManagement>
1) Base de datos:

El funcionamiento de activiti requiere el soporte de la base de datos, las bases de datos soportadas son: h2, mysql, oracle, postgres, mssql, db2.

3.2.2 Instalación bajo el diseñador de procesos IDEA

Busque el submenú "Configuración" en el menú Archivo de IDEA y luego seleccione el menú "complementos" a la izquierda, como se muestra en la siguiente figura:

En este punto podemos buscar el complemento actiBPM, que es Activiti Designerla versión IDEA, y hacemos clic en Instalar para instalarlo.

Después de la instalación, la página es la siguiente:

Indica que la idea debe reiniciarse, haga clic en Reiniciar.

Una vez que se complete el reinicio, abra Complementos (lista de complementos) en Configuración nuevamente, haga clic en Instalado (complementos instalados) a la derecha, y si ve actiBPM en la lista, significa que se instaló correctamente, como se muestra a continuación. cifra:

En los siguientes cursos, utilizaremos este diseñador de procesos para el diseño de procesos de Activiti.

3.3 Soporte de base de datos de Activiti

Activiti necesita el soporte de la base de datos en tiempo de ejecución y utiliza 25 tablas para leer el contenido del nodo de definición del proceso en la tabla de la base de datos para su uso posterior.

3.3.1 Bases de datos compatibles con Activiti

Las bases de datos y versiones soportadas por activiti son las siguientes:

3.3.2 Generar tablas en MySQL

3.3.2.1 Crear base de datos

Crear actividades de base de datos mysql (cualquier nombre):

CREATE DATABASE activiti DEFAULT CHARACTER SET utf8;

3.3.2.2 Usar código Java para generar tablas

  • Crear un proyecto Java

Use idea para crear un proyecto maven de java, llamado: activiti01.

  • Agregar coordenadas de dependencias maven (paquete jar)

Primero, debe agregar el paquete jar requerido por ProcessEngine al proyecto java, que incluye:

  1. actividades-motor-7.0.0.beta1.jar
  2. Los paquetes jar de los que depende la actividad: mybatis, alf4j, log4j, etc.
  3. El paquete de primavera del que depende la actividad
  4. controlador de base de datos mysql
  5. Grupo de conexiones de datos de terceros dbcp
  6. unidad-prueba-junit-4.12.jar

Usamos maven para construir el proyecto, por lo que las coordenadas correspondientes a estos frascos deben importarse al archivo pom.xml.

Las dependencias completas son las siguientes:

<properties>
    <slf4j.version>1.6.6</slf4j.version>
    <log4j.version>1.2.12</log4j.version>
    <activiti.version>7.0.0.Beta1</activiti.version>
</properties>
<dependencies>
    <dependency>
        <groupId>org.activiti</groupId>
        <artifactId>activiti-engine</artifactId>
        <version>${activiti.version}</version>
    </dependency>
    <dependency>
        <groupId>org.activiti</groupId>
        <artifactId>activiti-spring</artifactId>
        <version>${activiti.version}</version>
    </dependency>
    <!-- bpmn 模型处理 -->
    <dependency>
        <groupId>org.activiti</groupId>
        <artifactId>activiti-bpmn-model</artifactId>
        <version>${activiti.version}</version>
    </dependency>
    <!-- bpmn 转换 -->
    <dependency>
        <groupId>org.activiti</groupId>
        <artifactId>activiti-bpmn-converter</artifactId>
        <version>${activiti.version}</version>
    </dependency>
    <!-- bpmn json数据转换 -->
    <dependency>
        <groupId>org.activiti</groupId>
        <artifactId>activiti-json-converter</artifactId>
        <version>${activiti.version}</version>
    </dependency>
    <!-- bpmn 布局 -->
    <dependency>
        <groupId>org.activiti</groupId>
        <artifactId>activiti-bpmn-layout</artifactId>
        <version>${activiti.version}</version>
    </dependency>
    <!-- activiti 云支持 -->
    <dependency>
        <groupId>org.activiti.cloud</groupId>
        <artifactId>activiti-cloud-services-api</artifactId>
        <version>${activiti.version}</version>
    </dependency>
    <!-- mysql驱动 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.40</version>
    </dependency>
    <!-- mybatis -->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.4.5</version>
    </dependency>
    <!-- 链接池 -->
    <dependency>
        <groupId>commons-dbcp</groupId>
        <artifactId>commons-dbcp</artifactId>
        <version>1.4</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
    </dependency>
    <!-- log start -->
    <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>${log4j.version}</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>${slf4j.version}</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>${slf4j.version}</version>
    </dependency>
</dependencies>
  • Agregar configuración de registro log4j

Usamos el paquete de registro log4j, que puede configurar el registro

Crear log4j.properties en recursos

# Set root category priority to INFO and its only appender to CONSOLE.
#log4j.rootCategory=INFO, CONSOLE debug info warn error fatal
log4j.rootCategory=debug, CONSOLE, LOGFILE
# Set the enterprise logger category to FATAL and its only appender to CONSOLE.
log4j.logger.org.apache.axis.enterprise=FATAL, CONSOLE
# CONSOLE is set to be a ConsoleAppender using a PatternLayout.
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} %-6r[%15.15t] %-5p %30.30c %x - %m\n
# LOGFILE is set to be a File appender using a PatternLayout.
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File=f:\act\activiti.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%d{ISO8601} %-6r[%15.15t] %-5p %30.30c %x - %m\n
  • Agregar archivo de configuración de actividades

Usamos el método predeterminado proporcionado por activiti para crear tablas mysql.

El requisito del método predeterminado es crear activiti.cfg.xmlun archivo Nota: el directorio y el nombre de archivo del método predeterminado no se pueden modificar, porque el código fuente de activiti se ha configurado para leer archivos con un nombre de archivo fijo en un directorio fijo .

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
                    http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/contex
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
</beans>
  • Configurar en activiti.cfg.xml

activiti.cfg.xmlEl método predeterminado debe ser el nombre del bean en el medio processEngineConfiguration, y el nombre no se puede modificar

Aquí hay 2 métodos de configuración: uno es configurar la fuente de datos por separado y el otro es no configurar la fuente de datos por separado.

1. Configuración directaprocessEngineConfiguration

processEngineConfigurationSe utiliza para crear ProcessEngine, y la operación de la base de datos se realizará ProcessEnginecuando .

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                    http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/contex
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
    <!-- 默认id对应的值 为processEngineConfiguration -->
    <!-- processEngine Activiti的流程引擎 -->
    <bean id="processEngineConfiguration"
          class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
        <property name="jdbcDriver" value="com.mysql.jdbc.Driver"/>
        <property name="jdbcUrl" value="jdbc:mysql:///activiti"/>
        <property name="jdbcUsername" value="root"/>
        <property name="jdbcPassword" value="123456"/>
        <!-- activiti数据库表处理策略 -->
        <property name="databaseSchemaUpdate" value="true"/>
    </bean>
</beans>

2. Después de configurar la fuente de datos, processEngineConfigurationconsulte

Primero configure la fuente de datos

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                    http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/contex
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">

    <!-- 这里可以使用 链接池 dbcp-->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <property name="url" value="jdbc:mysql:///activiti" />
        <property name="username" value="root" />
        <property name="password" value="123456" />
        <property name="maxActive" value="3" />
        <property name="maxIdle" value="1" />
    </bean>

    <bean id="processEngineConfiguration"
          class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
        <!-- 引用数据源 上面已经设置好了-->
        <property name="dataSource" ref="dataSource" />
        <!-- activiti数据库表处理策略 -->
        <property name="databaseSchemaUpdate" value="true"/>
    </bean>
</beans>
  • Programa de escritura de clase Java para generar tabla

Cree una clase de prueba, llame a la clase de herramienta de activiti y genere las tablas de base de datos que necesita acitivti.

El uso directo de la clase de herramienta proporcionada por activiti leerá los archivos ProcessEnginesdebajo de classpath de forma predeterminada , leerá la configuración de la base de datos en él, creará y creará tablas automáticamente al crear .activiti.cfg.xmlProcessEngineProcessEngine

el código se muestra a continuación:

package com.itheima.activiti01.test;

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngineConfiguration;
import org.junit.Test;

public class TestDemo {
    /**
     * 生成 activiti的数据库表
     */
    @Test
    public void testCreateDbTable() {
        //使用classpath下的activiti.cfg.xml中的配置创建processEngine
  ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
  System.out.println(processEngine);
    }
}

ilustrar:

  • Ejecute el segmento de programa anterior para completar la creación de la tabla de actividades e implemente diferentes estrategias de procesamiento de tablas de datos cambiando el valor del parámetro activiti.cfg.xmlen .databaseSchemaUpdate
  • Cuando se ejecuta el getDefaultProcessEnginemétodo , activiti.cfg.xmlencuentre un nombre fijo de él processEngineConfiguration.

Durante la ejecución del programa de prueba, la consola de ideas generará registros, lo que indica que el programa está creando una tabla de datos, similar a la siguiente, preste atención al contenido de la línea roja:

Una vez completada la ejecución, verificamos la base de datos y creamos tablas 25. Los resultados son los siguientes:

En este punto, hemos completado la creación de la base de datos y las tablas necesarias para que se ejecuten las actividades.

3.4 Introducción a la estructura de la tabla

3.4.1 Reglas de nomenclatura y funciones de las tablas

Al ver la tabla recién creada, encontramos que todas las tablas de Activiti ACT_comienzan con .

La segunda parte es una designación de dos letras que indica el propósito de la tabla. La finalidad también corresponde a la API del servicio.

  • ACT_RE: 'RE' significa repositorio. Las tablas con este prefijo contienen definiciones de procesos y procesan recursos estáticos (imágenes, reglas, etc.).
  • ACT_RU: 'RU' significa tiempo de ejecución. Estas tablas de tiempo de ejecución contienen datos en ejecución, como instancias de procesos, tareas, variables, tareas asincrónicas, etc. Activiti solo guarda estos datos durante la ejecución de la instancia del proceso y elimina estos registros al final del proceso. De esta forma, la tabla de tiempo de ejecución siempre puede ser pequeña y rápida.
  • ACT_HI: 'HI' significa historia. Estas tablas contienen datos históricos como instancias de procesos históricos, variables, tareas, etc.
  • ACT_GE: GE significa general. Datos comunes, utilizados en diferentes escenarios
3.4.2 Introducción a la tabla de datos de actividad

imagen-20230515095521896

Cuatro, diagrama de relación de clases de Activiti

Arriba, hemos completado la generación de la tabla de la base de datos de Activiti. En el código Java, llamamos a la clase de herramienta de Activiti. Comprendamos la relación de clase de Activiti.

4.1 Diagrama de clases

En la nueva versión, podemos encontrar a través de experimentos IdentityServiceque FormServiceambos Servicios han sido eliminados.

Por lo tanto, no explicaremos estos dos Servicios más adelante, pero todavía existen estos dos Servicios en la versión anterior, los estudiantes deben comprender

4.2 activiti.cfg.xml

El archivo de configuración del motor de activiti incluye: ProcessEngineConfigurationdefinición, definición de origen de datos, administrador de transacciones, etc. Este archivo es en realidad un archivo de configuración Spring.

4.3 Clase de configuración del motor de proceso

La clase de configuración del motor de procesos ( ProcessEngineConfiguration), a través de la cual ProcessEngineConfigurationse puede crear el motor de flujo de trabajo ProceccEngine, los dos métodos comúnmente utilizados son los siguientes:

4.3.1 Configuración del motor de proceso independiente

El uso StandaloneProcessEngineConfigurationActivitipuede ejecutarse solo, para crear ProcessEngine, Activitimanejará la transacción por sí mismo.

Método del archivo de configuración:

Por lo general, activiti.cfg.xmlun bean con una identificación processEngineConfigurationde .

Métodos de la siguiente manera:

<bean id="processEngineConfiguration"
          class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
        <!--配置数据库相关的信息-->
        <!--数据库驱动-->
        <property name="jdbcDriver" value="com.mysql.jdbc.Driver"/>
        <!--数据库链接-->
        <property name="jdbcUrl" value="jdbc:mysql:///activiti"/>
        <!--数据库用户名-->
        <property name="jdbcUsername" value="root"/>
        <!--数据库密码-->
        <property name="jdbcPassword" value="123456"/>
        <!--actviti数据库表在生成时的策略  true - 如果数据库中已经存在相应的表,那么直接使用,如果不存在,那么会创建-->
        <property name="databaseSchemaUpdate" value="true"/>
    </bean>

También puede unirse al grupo de conexiones:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                    http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/contex
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql:///activiti"/>
        <property name="username" value="root"/>
        <property name="password" value="123456"/>
        <property name="maxActive" value="3"/>
        <property name="maxIdle" value="1"/>
    </bean>
    <!--在默认方式下 bean的id  固定为 processEngineConfiguration-->
    <bean id="processEngineConfiguration"
          class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
        <!--引入上面配置好的 链接池-->
        <property name="dataSource" ref="dataSource"/>
        <!--actviti数据库表在生成时的策略  true - 如果数据库中已经存在相应的表,那么直接使用,如果不存在,那么会创建-->
        <property name="databaseSchemaUpdate" value="true"/>
    </bean>
</beans>
4.3.2 Configuración de SpringProcessEngine

A través de org.activiti.spring.SpringProcessEngineConfigurationla integración con Spring.

Cree un archivo de configuración integrado para spring y activiti:

activity-spring.cfg.xml(el nombre puede ser modificado)

<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
   xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
      http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
      http://www.springframework.org/schema/mvc
      http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd
      http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context-3.1.xsd
      http://www.springframework.org/schema/aop
      http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
      http://www.springframework.org/schema/tx
      http://www.springframework.org/schema/tx/spring-tx-3.1.xsd ">
   <!-- 工作流引擎配置bean -->
   <bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration">
      <!-- 数据源 -->
      <property name="dataSource" ref="dataSource" />
      <!-- 使用spring事务管理器 -->
      <property name="transactionManager" ref="transactionManager" />
      <!-- 数据库策略 -->
      <property name="databaseSchemaUpdate" value="drop-create" />
      <!-- activiti的定时任务关闭 -->
     <property name="jobExecutorActivate" value="false" />
   </bean>
   <!-- 流程引擎 -->
   <bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean">
      <property name="processEngineConfiguration" ref="processEngineConfiguration" />
   </bean>
   <!-- 资源服务service -->
   <bean id="repositoryService" factory-bean="processEngine"
      factory-method="getRepositoryService" />
   <!-- 流程运行service -->
   <bean id="runtimeService" factory-bean="processEngine"
      factory-method="getRuntimeService" />
   <!-- 任务管理service -->
   <bean id="taskService" factory-bean="processEngine"
      factory-method="getTaskService" />
   <!-- 历史管理service -->
   <bean id="historyService" factory-bean="processEngine" factory-method="getHistoryService" />
   <!-- 用户管理service -->
   <bean id="identityService" factory-bean="processEngine" factory-method="getIdentityService" />
   <!-- 引擎管理service -->
   <bean id="managementService" factory-bean="processEngine" factory-method="getManagementService" />
   <!-- 数据源 -->
   <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
      <property name="driverClassName" value="com.mysql.jdbc.Driver" />
      <property name="url" value="jdbc:mysql://localhost:3306/activiti" />
      <property name="username" value="root" />
      <property name="password" value="mysql" />
      <property name="maxActive" value="3" />
      <property name="maxIdle" value="1" />
   </bean>
   <!-- 事务管理器 -->
   <bean id="transactionManager"
    class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
      <property name="dataSource" ref="dataSource" />
   </bean>
   <!-- 通知 -->
   <tx:advice id="txAdvice" transaction-manager="transactionManager">
      <tx:attributes></tx:attributes>
          <!-- 传播行为 -->
          <tx:method name="save*" propagation="REQUIRED" />
          <tx:method name="insert*" propagation="REQUIRED" />
          <tx:method name="delete*" propagation="REQUIRED" />
          <tx:method name="update*" propagation="REQUIRED" />
          <tx:method name="find*" propagation="SUPPORTS" read-only="true" />
          <tx:method name="get*" propagation="SUPPORTS" read-only="true" />
       </tx:attributes>
   </tx:advice>
   <!-- 切面,根据具体项目修改切点配置 -->
   <aop:config proxy-target-class="true">
      <aop:advisor advice-ref="txAdvice"  pointcut="execution(* com.itheima.ihrm.service.impl.*.(..))"* />
  </aop:config>
</beans>

crearprocessEngineConfiguration

ProcessEngineConfiguration configuration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml")

activiti.cfg.xmlDebe haber un processEngineConfigurationbean en el requisito de código anterior

También puede usar el siguiente método para cambiar el nombre del bean:

ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(String resource, String beanName);

4.4 Creación del motor de flujo de trabajo

El motor de flujo de trabajo (ProcessEngine), que es equivalente a una interfaz de fachada, se ProcessEngineConfigurationcrea processEngineal ProcessEnginecrear cada interfaz de servicio.

4.4.1 Método de creación predeterminado

El nombre del archivo y la ruta son fijos activiti.cfg.xml, y hayactiviti.cfg.xml configuraciones en el archivo , puede usar el siguiente código para crear :processEngineConfigurationprocessEngine

//直接使用工具类 ProcessEngines,使用classpath下的activiti.cfg.xml中的配置创建processEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
System.out.println(processEngine);
4.4.2 Método general de creación
//先构建ProcessEngineConfiguration
ProcessEngineConfiguration configuration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml");
//通过ProcessEngineConfiguration创建ProcessEngine,此时会创建数据库
ProcessEngine processEngine = configuration.buildProcessEngine();
4.5 Interfaz de servicio de servicio

El servicio es la interfaz de servicio proporcionada por el motor de flujo de trabajo para la implementación, ejecución y administración del flujo de trabajo. Usamos estas interfaces para ser las tablas de datos correspondientes a los servicios de operación.

4.5.1 Método de creación del servicio

Crear servicio a través de ProcessEngine

El camino es el siguiente:

RuntimeService runtimeService = processEngine.getRuntimeService();
RepositoryService repositoryService = processEngine.getRepositoryService();
TaskService taskService = processEngine.getTaskService();

4.5.2 Descripción general de los servicios

una breve introducción:

  • Servicio de repositorio

Es la clase de gestión de recursos de activiti, que proporciona operaciones para gestionar y controlar paquetes de liberación de procesos y definiciones de procesos. Un diagrama de flujo empresarial diseñado con una herramienta de modelado de flujo de trabajo necesita usar este servicio para implementar el contenido del archivo de definición de proceso en la computadora.

Además de implementar definiciones de procesos, también puede: Consultar el paquete de versión y la definición de procesos en el motor.

Pausa o activa los paquetes de lanzamiento, correspondientes a todas las definiciones de proceso específicas. Suspender significa que ya no pueden realizar ninguna operación, activar es la operación inversa correspondiente. Acceso a diversos recursos, como archivos incluidos en el paquete de distribución o diagramas de flujo generados automáticamente por el motor.

Obtenga la versión pojo de la definición del proceso, que se puede usar para analizar el proceso a través de java en lugar de xml.

  • RuntimeService

Clase de gestión de operaciones de procesos de Activiti. Puede obtener mucha información sobre la ejecución del proceso de esta clase de servicio

  • Servicio de tareas

Clase de gestión de tareas de Activiti. La información de la tarea se puede obtener de esta clase.

  • HistorialServicio

La clase de gestión de historial de Activiti puede consultar información histórica. Cuando se ejecuta el proceso, el motor guardará una gran cantidad de datos (de acuerdo con la configuración), como la hora de inicio de la instancia del proceso, los participantes de la tarea, el tiempo para completar la tarea, la ruta de ejecución de cada instancia de proceso, etc. esperar. Este servicio obtiene estos datos principalmente a través de la función de consulta.

  • Servicio de Administracion

La clase de gestión del motor de Activiti proporciona funciones de gestión y mantenimiento para el motor de procesos de Activiti.Estas funciones no se utilizan en aplicaciones basadas en flujos de trabajo y se utilizan principalmente para el mantenimiento diario del sistema Activiti.

5. Primeros pasos con Activiti

En este capítulo, vamos a crear un flujo de trabajo de Activiti e iniciar el proceso.

La creación de un flujo de trabajo de Activiti incluye principalmente los siguientes pasos:

  • Defina el proceso, de acuerdo con la especificación BPMN, use la herramienta de definición de procesos para describir todo el proceso con símbolos de proceso
  • Implemente el proceso, cargue el archivo de definición de proceso dibujado en la base de datos y genere datos de tabla
  • Inicie el proceso y use el código Java para manipular el contenido de la tabla de la base de datos

5.1 Símbolos de proceso

BPMN 2.0 es un acrónimo de Business Process Modeling Notation 2.0.

Fue creado y desarrollado continuamente por Business Process Management Initiative, una asociación sin fines de lucro. Como señal, BPMN 2.0 es un conjunto de especificaciones de notación que utilizan algunas notaciones para aclarar el diagrama de flujo del diseño de procesos comerciales, lo que puede mejorar la eficiencia de la comunicación durante el modelado comercial.

Actualmente, BPMN2.0 es la última versión, que se utiliza para el diseño y la comunicación visual en el contexto de BPM.

A continuación, primero comprendamos los símbolos comunes en el diseño de procesos.

El cumplimiento básico de BPMN2.0 incluye principalmente:

Evento Evento

Actividad Actividad

Actividad es un término general para trabajo o tarea. Una actividad puede ser una tarea o un subproceso del proceso actual; en segundo lugar, también puede especificar diferentes tipos para la actividad. Las actividades comunes son las siguientes:

GatewayGateWay

Las puertas de enlace se utilizan para procesar decisiones. Hay varias puertas de enlace de uso común que deben entenderse:

puerta de enlace exclusiva (x)

- Solo se elegirá un camino. Cuando el proceso se ejecuta en la puerta de enlace, se calcula uno por uno de acuerdo con el orden del flujo de salida, y cuando el resultado del cálculo de la condición es verdadero, continúa ejecutando el flujo de salida de la puerta de enlace actual;

  • Si varias rutas se evalúan como verdaderas, se ejecuta la primera ruta verdadera. Si ninguna de las puertas de enlace se evalúa como verdadera, el motor genera una excepción.
  • La puerta de enlace exclusiva debe usarse junto con el flujo de secuencia condicional. El atributo predeterminado especifica el flujo de secuencia predeterminado. Cuando no se cumplen todas las condiciones, se ejecutará el flujo de secuencia predeterminado.

Puerta de enlace paralela (+)

- todas las rutas se seleccionarán al mismo tiempo

  • Dividir: ejecuta todos los flujos de secuencia de salida en paralelo, creando una línea de ejecución paralela para cada flujo de secuencia.
  • Fusionar: todas las líneas que se separan de la puerta de enlace paralela y se ejecutan esperan aquí, hasta que se ejecutan todas las líneas antes de continuar con la ejecución hacia abajo.

Puerta de enlace inclusiva (+)

-- Se pueden ejecutar varias líneas al mismo tiempo, o se pueden establecer condiciones en la puerta de enlace

  • Dividir: evalúe la expresión en cada línea, cuando la expresión se evalúe como verdadera, cree una línea paralela y continúe con la ejecución
  • Fusionar: todas las líneas que se separan de la puerta de enlace paralela y se ejecutan esperan aquí, hasta que se ejecutan todas las líneas antes de continuar con la ejecución hacia abajo.

Pasarela de eventos (+)

—— Especialmente configurado para eventos de captura intermedios, lo que permite que varios flujos de salida apunten a varios eventos de captura intermedios diferentes. Cuando el proceso se ejecuta en la puerta de enlace de eventos, el proceso está en estado de espera y debe esperar a que se inicie un evento para convertir el estado de espera en un estado activo.

Flujo a flujo

Un flujo es un cable que conecta dos nodos de proceso. Las direcciones de flujo comunes incluyen lo siguiente:

5.2 Uso del Diseñador de procesos

Usos de Activiti-Designer
Paleta

Se puede usar después de instalar el complemento en idea, y el tablero de dibujo incluye los siguientes nodos:

  • Conexión—conexión
  • Evento—evento
  • Tarea—tarea
  • Puerta de enlace—puerta de enlace
  • Contenedor—contenedor
  • Evento de límite—Evento de límite
  • Evento intermedio- - Evento intermedio

Después de diseñar el diagrama de flujo, guarde y genere un archivo .bpmn

Nuevo proceso (herramienta IDEA)

Primero seleccione el directorio donde se almacenan los gráficos (seleccione el directorio bpmn en recursos), haga clic en el menú: New -> BpmnFile, como se muestra en la figura:

Aparece un cuadro como el que se muestra en la siguiente figura, ingrese evection para indicar el proceso de aprobación del viaje de negocios:

Después de nombrar el evento (la extensión predeterminada es bpmn), puede ver la página de diseño del proceso, como se muestra en la figura:

El área de la izquierda es el área de dibujo y el área de la derecha es el área de la paleta.

Haga clic en los elementos del tablero de dibujo con el mouse para dibujar en el lado izquierdo

proceso de dibujo

Usa la patineta para dibujar el proceso, arrastrando el icono de la tabla de dibujo de derecha a izquierda, el efecto final es el siguiente:

Especifique la clave de definición del proceso

La clave de definición del proceso es la identificación de la definición del proceso, y la clave del proceso se puede ver a través de la vista de propiedades

líder de tarea designado

Especifique la persona a cargo de cada nodo de tarea en la vista de propiedades, por ejemplo: la persona a cargo de completar la solicitud de viaje de negocios es zhangsan

  • la persona a cargo de la aprobación del gerente es jerry
  • El encargado de la aprobación por parte del gerente general es Jack
  • La persona a cargo de la aprobación financiera es rosa.

6. Operación del proceso

6.1 Definición del proceso

descripción general

La definición del proceso consiste en describir el proceso comercial fuera de línea de acuerdo con el estándar bpmn2.0 y, por lo general, utiliza el complemento en la idea para modelar el proceso comercial.

Use el diseñador diseñador bajo la idea de dibujar el proceso y se generarán dos archivos: .bpmn y .png

archivo .bpmn

El uso de activiti-desinger para diseñar un proceso comercial generará un archivo .bpmn, sobre el cual hemos creado el archivo bpmn

El nodo raíz de BPMN 2.0 es el nodo de definiciones. En este elemento, se pueden definir múltiples definiciones de procesos (pero recomendamos que cada archivo contenga solo una definición de proceso, lo que puede simplificar la dificultad de mantenimiento durante el proceso de desarrollo).

Tenga en cuenta que el elemento de definiciones debe contener al menos las declaraciones de xmlns y targetNamespace. targetNamespace puede ser cualquier valor, se utiliza para clasificar la instancia del proceso.

  • Parte de definición del proceso: define la descripción de cada nodo del proceso y el flujo del proceso entre nodos.
  • Definición del diseño del proceso: defina información como las coordenadas de posición de cada nodo del proceso en el diagrama de flujo.
Generar archivo de imagen .png

Modo de operación en la herramienta IDEA

1. Modifique el sufijo del archivo a xml

Primero, cambie el nombre del archivo evection.bpmn a evection.xml, como se muestra a continuación:

Se modifica el archivo bpmn antes de evection.xml, el efecto es el siguiente:

2. Use el diseñador para abrir el archivo .xml

En el archivo evection.xml, haga clic con el botón derecho y seleccione el menú Diagramas, luego seleccioneShow BPMN2.0 Designer…

3. Ver archivos abiertos

Después de abrir, aparecen caracteres ilegibles, como se muestra en la figura:

4. Resuelva los caracteres ilegibles chinos

1. Abra Configuración, busque Codificaciones de archivos y seleccione UTF-8 para todas las opciones de codificación.

2. Abra la ruta de instalación de IDEA y busque el siguiente directorio de instalación

Depende de la versión que tenga instalada, estoy usando una idea de 64 bits, así que idea64.exe.vmoptionsagregue un comando en la última línea del archivo:-Dfile.encoding=UTF-8

Como sigue:

Tenga cuidado de no tener espacios, de lo contrario, IDEA no se abrirá cuando lo reinicie y luego reinicie IDEA.

Si el método anterior se ha completado y aún aparecen caracteres ilegibles, modifique otro archivo y agregue: al final del archivo -Dfile.encoding=UTF-8, y luego reinicie idea, como se muestra en la figura:

Finalmente, en el archivo evection.xml, haga clic derecho y seleccione el menú Diagramas, y luego seleccione para Show BPMN2.0 Designer…ver la imagen generada, como se muestra en la figura:

Hasta ahora, resuelve el problema distorsionado.

5. Exportar como archivo de imagen

Haga clic Export To Fileen el ícono pequeño para abrir la siguiente ventana, preste atención para completar el nombre y la extensión del archivo y elija la ubicación para guardar la imagen:

Luego, copiamos el archivo png en el directorio bpmn en recursos y cambiamos el nombre de evection.xml a evection.bpmn.

6.2 Implementación de definición de procesos

descripción general

La implementación del proceso definido anteriormente en el diseñador en la base de datos de actividades es la implementación de la definición del proceso.

Agregue e implemente los archivos bpmn y png de la definición del proceso en activiti uno por uno llamando a la API de activiti, o empaquete los dos archivos en un paquete zip para su implementación.

implementación de un solo archivo

Implemente el archivo bpmn y el archivo de imagen png respectivamente.

public class ActivitiDemo {
    /**
     * 部署流程定义
     */
    @Test
    public void testDeployment(){
//        1、创建ProcessEngine
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//        2、得到RepositoryService实例
        RepositoryService repositoryService = processEngine.getRepositoryService();
//        3、使用RepositoryService进行部署
        Deployment deployment = repositoryService.createDeployment()
                .addClasspathResource("bpmn/evection.bpmn") // 添加bpmn资源
                .addClasspathResource("bpmn/evection.png")  // 添加png资源
                .name("出差申请流程")
                .deploy();
//        4、输出部署信息
        System.out.println("流程部署id:" + deployment.getId());
        System.out.println("流程部署名称:" + deployment.getName());
    }
}

Después de realizar esta operación, activiti guardará el archivo bpm y el archivo de imagen especificados en el código anterior en la base de datos de activiti.

Método de implementación de paquetes comprimidos

Comprimir evection.bpmny evection.pngcomprimir en un paquete zip.

@Test
 public void deployProcessByZip() {
  // 定义zip输入流
  InputStream inputStream = this
    .getClass()
    .getClassLoader()
    .getResourceAsStream(
      "bpmn/evection.zip");
  ZipInputStream zipInputStream = new ZipInputStream(inputStream);
  // 获取repositoryService
  RepositoryService repositoryService = processEngine
    .getRepositoryService();
  // 流程部署
  Deployment deployment = repositoryService.createDeployment()
    .addZipInputStream(zipInputStream)
    .deploy();
  System.out.println("流程部署id:" + deployment.getId());
  System.out.println("流程部署名称:" + deployment.getName());
 }

Después de realizar esta operación, activiti guardará el archivo bpm y el archivo de imagen especificados en el código anterior en la base de datos de activiti.

Hoja de datos operativos

Las tres tablas para las actividades operativas después de implementar la definición del proceso son las siguientes:

  • act_re_deploymentTabla de implementación de definición de proceso, cada implementación agrega un registro
  • act_re_procdefTabla de definición de procesos, la implementación de cada nueva definición de proceso agregará un registro a esta tabla
  • act_ge_bytearrayTabla de recursos de proceso

A continuación, echemos un vistazo a qué datos se escriben:

SELECT * FROM act_re_deployment #流程定义部署表,记录流程部署信息

resultado:

SELECT * FROM act_re_procdef #流程定义表,记录流程定义信息

resultado:

Tenga en cuenta que el campo CLAVE es una palabra clave utilizada para identificar de forma única diferentes procesos

SELECT * FROM act_ge_bytearray #资源表

resultado:

Aviso:

act_re_deploymentY act_re_procdefuna relación de uno a muchos, una implementación genera un registro en la tabla de implementación de procesos, pero una implementación puede implementar múltiples definiciones de procesos, y cada definición de proceso genera un registro en la tabla de definición de procesos. Cada definición de proceso act_ge_bytearraytendrá dos registros de recursos, bpmn y png.

Sugerencia: implemente un proceso a la vez, de modo que la tabla de implementación y la tabla de definición de procesos tengan una relación de uno a uno, lo cual es conveniente para leer la información de implementación y definición de procesos.

6.3 Iniciar instancia de proceso

Después de implementar la definición del proceso en activiti, el proceso comercial se puede administrar a través del flujo de trabajo, es decir, se puede usar el proceso de solicitud de viajes de negocios implementado anteriormente.

Para este proceso, iniciar un proceso significa lanzar un nuevo formulario de solicitud de viaje de negocios, que es equivalente a la relación entre una clase java y un objeto java. Después de definir la clase, debe crear un objeto con new. Por supuesto, debe puede nuevos objetos múltiples. Para el proceso de solicitud de viaje de negocios, Zhang San debe iniciar una instancia de proceso cuando inicia un formulario de solicitud de viaje de negocios, y debe iniciarse una instancia de proceso cuando el formulario de solicitud de viaje de negocios inicia una orden de viaje de negocios.

el código se muestra a continuación:

    /**
     * 启动流程实例
     */
    @Test
    public void testStartProcess(){
//        1、创建ProcessEngine
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//        2、获取RunTimeService
        RuntimeService runtimeService = processEngine.getRuntimeService();
//        3、根据流程定义Id启动流程
        ProcessInstance processInstance = runtimeService
                .startProcessInstanceByKey("myEvection");
//        输出内容
        System.out.println("流程定义id:" + processInstance.getProcessDefinitionId());
        System.out.println("流程实例id:" + processInstance.getId());
        System.out.println("当前活动Id:" + processInstance.getActivityId());
    }

La salida es la siguiente:

Hoja de datos operativos

  • act_hi_actinstHistorial de ejecución de la instancia de proceso
  • act_hi_identitylinkProcesar la información del historial de participación del usuario
  • act_hi_procinstInformación del historial de instancias de proceso
  • act_hi_taskinstProcesar la información del historial de tareas
  • act_ru_executionInformación de ejecución del proceso
  • act_ru_identitylinkInformación del usuario participante del proceso
  • act_ru_taskinformación de la tarea

6.4 Consulta de tareas

Una vez que se inicia el proceso, la persona a cargo de la tarea puede consultar las tareas que necesita procesar actualmente, y las tareas que se consultan son todas las tareas pendientes del usuario.

/**
     * 查询当前个人待执行的任务
      */
    @Test
    public void testFindPersonalTaskList() {
//        任务负责人
        String assignee = "zhangsan";
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//        创建TaskService
        TaskService taskService = processEngine.getTaskService();
//        根据流程key 和 任务负责人 查询任务
        List<Task> list = taskService.createTaskQuery()
                .processDefinitionKey("myEvection") //流程Key
                .taskAssignee(assignee)//只查询该任务负责人的任务
                .list();

        for (Task task : list) {

            System.out.println("流程实例id:" + task.getProcessInstanceId());
            System.out.println("任务id:" + task.getId());
            System.out.println("任务负责人:" + task.getAssignee());
            System.out.println("任务名称:" + task.getName());

        }
    }

La salida es la siguiente:

流程实例id:2501
任务id:2505
任务负责人:zhangsan
任务名称:创建出差申请

6.5 Procesamiento de tareas de proceso

El líder de la tarea consulta las tareas pendientes, selecciona las tareas para procesar y completa las tareas.

// 完成任务
    @Test
    public void completTask(){
//        获取引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//        获取taskService
        TaskService taskService = processEngine.getTaskService();

//        根据流程key 和 任务的负责人 查询任务
//        返回一个任务对象
        Task task = taskService.createTaskQuery()
                .processDefinitionKey("myEvection") //流程Key
                .taskAssignee("zhangsan")  //要查询的负责人
                .singleResult();

//        完成任务,参数:任务id
        taskService.complete(task.getId());
    }

6.6 Consulta de información de definición de proceso

Consultar información relacionada con el proceso, incluida la definición del proceso, la implementación del proceso y la versión de la definición del proceso

    /**
     * 查询流程定义
     */
    @Test
    public void queryProcessDefinition(){
        //        获取引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//        repositoryService
        RepositoryService repositoryService = processEngine.getRepositoryService();
//        得到ProcessDefinitionQuery 对象
        ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();
//          查询出当前所有的流程定义
//          条件:processDefinitionKey =evection
//          orderByProcessDefinitionVersion 按照版本排序
//        desc倒叙
//        list 返回集合
        List<ProcessDefinition> definitionList = processDefinitionQuery.processDefinitionKey("myEvection")
                .orderByProcessDefinitionVersion()
                .desc()
                .list();
//      输出流程定义信息
        for (ProcessDefinition processDefinition : definitionList) {
            System.out.println("流程定义 id="+processDefinition.getId());
            System.out.println("流程定义 name="+processDefinition.getName());
            System.out.println("流程定义 key="+processDefinition.getKey());
            System.out.println("流程定义 Version="+processDefinition.getVersion());
            System.out.println("流程部署ID ="+processDefinition.getDeploymentId());
        }

    }

Resultado de salida:

流程定义id:myEvection:1:4
流程定义名称:出差申请单
流程定义key:myEvection
流程定义版本:1

6.7 Eliminación de procesos

public void deleteDeployment() {
  // 流程部署id
  String deploymentId = "1";

    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    // 通过流程引擎获取repositoryService
  RepositoryService repositoryService = processEngine
    .getRepositoryService();
  //删除流程定义,如果该流程定义已有流程实例启动则删除时出错
  repositoryService.deleteDeployment(deploymentId);
  //设置true 级联删除流程定义,即使该流程有流程实例启动也可以删除,设置为false非级别删除方式,如果流程
  //repositoryService.deleteDeployment(deploymentId, true);
 }

ilustrar:

  • Use repositoryService para eliminar la definición del proceso y la información de la tabla de historial no se eliminará
  • Si no hay ningún proceso en ejecución en la definición del proceso, se puede eliminar con normalidad.

Si ya hay un proceso en ejecución en la definición del proceso, use la eliminación común para informar un error y use el método de eliminación en cascada para eliminar todo el proceso y los registros relacionados.

Elimine primero los nodos de proceso sin terminar y, finalmente, elimine por completo la información de definición del proceso.

Las operaciones de eliminación en cascada en el desarrollo de proyectos generalmente solo están disponibles para los superadministradores.

6.8 Descarga de recursos del proceso

Ahora nuestros archivos de recursos de proceso se han cargado en la base de datos. Si otros usuarios desean ver estos archivos de recursos, pueden descargar los archivos de recursos de la base de datos al local.

Las soluciones son:

  • Jdbc lee datos de tipo blob y clob y los guarda en el directorio de archivos
  • Use la API de activiti para lograr

Use commons-io.jar para resolver operaciones de IO

Introducir el paquete de dependencia commons-io

<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.6</version>
</dependency>

Obtenga recursos de definición de procesos a través de objetos de definición de procesos, obtenga bpmn y png

import org.apache.commons.io.IOUtils;

@Test
    public void deleteDeployment(){
//        获取引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//        获取repositoryService
        RepositoryService repositoryService = processEngine.getRepositoryService();
//        根据部署id 删除部署信息,如果想要级联删除,可以添加第二个参数,true
        repositoryService.deleteDeployment("1");
    }

    public void  queryBpmnFile() throws IOException {
//        1、得到引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//        2、获取repositoryService
        RepositoryService repositoryService = processEngine.getRepositoryService();
//        3、得到查询器:ProcessDefinitionQuery,设置查询条件,得到想要的流程定义
        ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
                .processDefinitionKey("myEvection")
                .singleResult();
//        4、通过流程定义信息,得到部署ID
        String deploymentId = processDefinition.getDeploymentId();
//        5、通过repositoryService的方法,实现读取图片信息和bpmn信息
//        png图片的流
        InputStream pngInput = repositoryService.getResourceAsStream(deploymentId, processDefinition.getDiagramResourceName());
//        bpmn文件的流
        InputStream bpmnInput = repositoryService.getResourceAsStream(deploymentId, processDefinition.getResourceName());
//        6、构造OutputStream流
        File file_png = new File("d:/evectionflow01.png");
        File file_bpmn = new File("d:/evectionflow01.bpmn");
        FileOutputStream bpmnOut = new FileOutputStream(file_bpmn);
        FileOutputStream pngOut = new FileOutputStream(file_png);
//        7、输入流,输出流的转换
        IOUtils.copy(pngInput,pngOut);
        IOUtils.copy(bpmnInput,bpmnOut);
//        8、关闭流
        pngOut.close();
        bpmnOut.close();
        pngInput.close();
        bpmnInput.close();
    }

ilustrar:

  • deploymentIdImplementar el ID para el proceso
  • resource_namees act_ge_bytearrayel valor de la columna NAME_ en la tabla
  • repositoryServiceEl método utilizado getDeploymentResourceNamespuede obtener los nombres de todos los archivos en la implementación especificada
  • El método utilizado repositoryServicepara getResourceAsStreampasar el ID de implementación y el nombre de la imagen del recurso puede obtener el flujo de entrada del archivo con el nombre especificado en la implementación.

El último genera los recursos de imagen en el flujo de entrada.

6.9 Ver información del historial del proceso

act_hi_*Incluso si se ha eliminado la definición del proceso, la información histórica de la ejecución del proceso aún se almacena en las tablas relevantes de actividades a través del análisis anterior . Por lo tanto, aún podemos consultar la información histórica de la ejecución del proceso y podemos HistoryServicever los registros históricos relevantes a través de .

    /**
     * 查看历史信息
     */
    @Test
    public void findHistoryInfo(){
//      获取引擎
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
//        获取HistoryService
        HistoryService historyService = processEngine.getHistoryService();
//        获取 actinst表的查询对象
        HistoricActivityInstanceQuery instanceQuery = historyService.createHistoricActivityInstanceQuery();
//        查询 actinst表,条件:根据 InstanceId 查询
//        instanceQuery.processInstanceId("2501");
//        查询 actinst表,条件:根据 DefinitionId 查询
        instanceQuery.processDefinitionId("myEvection:1:4");
//        增加排序操作,orderByHistoricActivityInstanceStartTime 根据开始时间排序 asc 升序
        instanceQuery.orderByHistoricActivityInstanceStartTime().asc();
//        查询所有内容
        List<HistoricActivityInstance> activityInstanceList = instanceQuery.list();
//        输出
        for (HistoricActivityInstance hi : activityInstanceList) {
            System.out.println(hi.getActivityId());
            System.out.println(hi.getActivityName());
            System.out.println(hi.getProcessDefinitionId());
            System.out.println(hi.getProcessInstanceId());
            System.out.println("<==========================>");
        }
    }

Resumir

Se introducen y completan las funciones básicas.Si necesita funciones más avanzadas como suspender, activar instancias de proceso, variables de proceso, etc., consulte

https://andyoung.blog.csdn.net/article/details/118345330

La combinación del motor de flujo de trabajo Activiti y Spring Boot facilitará el desarrollo, echemos un vistazo

https://andyoung.blog.csdn.net/article/details/118372175

Fuente: https://blog.csdn.net/agonie201218/article/details/118198535

Recomendación de artículo reciente:

1. Más de 1000 preguntas y respuestas de entrevistas en Java (última versión de 2022)

2. ¡Brillante! Las corrutinas de Java están llegando. . .

3. Tutorial de Spring Boot 2.x, ¡demasiado completo!

4. No llenes la pantalla de explosiones y explosiones, prueba el modo decorador, ¡esta es la forma elegante! !

5. La última versión del "Manual de desarrollo de Java (edición Songshan)", ¡descárguelo rápidamente!

¡Siéntete bien, no olvides darle me gusta + adelante!

Supongo que te gusta

Origin blog.csdn.net/youanyyou/article/details/130705348
Recomendado
Clasificación