Введение в базовое использование Activiti7

Activiti7
1. Введение в рабочий процесс
1.1 Концепция
рабочего процесса (Workflow) заключается в автоматизации управления бизнес-процессами посредством компьютеров. В основном он решает «
процесс автоматической передачи документов, информации или задач между несколькими участниками в соответствии с некоторыми заранее определенными правилами для достижения определенной ожидаемой бизнес-цели или содействия реализации этой цели».
1.2 Система рабочих процессов
Программная система выполняет функцию рабочего процесса. Мы называем это системой рабочих процессов. Какова функция рабочего процесса в системе? Это автоматизация управления бизнес-процессами системы
, поэтому рабочий процесс основан на бизнес-процессе, поэтому ядром программной системы является, по сути, бизнес-процесс системы, а рабочий процесс
предназначен только для оказания помощи в управлении. бизнес-процесса. Даже если бизнес-системы рабочего процесса нет, ее можно разработать и запустить, но с помощью рабочего процесса можно лучше управлять бизнес-процессами
и улучшить масштабируемость системы.
1.3 Применимые отрасли:
промышленность потребительских товаров, обрабатывающая промышленность, сфера телекоммуникационных услуг, сфера финансовых услуг, таких как страхование банковских ценных бумаг, сфера логистических услуг, сфера услуг по недвижимости, управление недвижимостью, крупные и средние компании по импорту и экспорту, государственные учреждения, научно-исследовательские институты
. индустрия образовательных услуг и т. д., особенно крупные транснациональные корпорации и группы компаний.
1.4 Конкретные приложения
1. Ключевые бизнес-процессы: заказы, обработка предложений, анализ контрактов, обработка звонков клиентов, управление цепочками поставок и т. д. 2.
Административное управление: заявки на командировки, заявки на сверхурочную работу, заявки на отпуска, заявки на автомобили, различные приложения для канцелярских товаров, Заявки на закупку, ежедневные и еженедельные отчеты и т. д. — все это
административные формы, которые изначально обрабатывались вручную.
3. Управление персоналом: организация обучения сотрудников, оценка производительности, обработка смены должностей, управление информацией о сотрудниках и т. д.
4. Категории, связанные с финансами: запрос платежа, обработка дебиторской задолженности, обработка ежедневного возмещения, возмещение командировки, заявка на бюджет и план и т. д.
5. Категория обслуживания клиентов: управление информацией о клиентах, жалобы клиентов, обработка запросов, управление послепродажным обслуживанием и т. д.
6. Категории специальных услуг: соответствующие процессы серии ISO, соответствующие процессы управления качеством, управление информацией о продуктах, обработка таможенных деклараций для торговых компаний, обработка отслеживания грузов для логистических компаний и т. д. могут автоматически регулироваться программным обеспечением рабочих процессов для различных задач, которые завершено вручную через формы,
постепенно внедряемые.
1.5 Метод реализации
До появления специального механизма рабочего процесса для реализации управления процессом мы обычно использовали значение поля состояния для отслеживания изменений процесса
. Таким образом, пользователи, не использующие роли, могут определить, отображается ли запись по значению поля статуса.
Для записей, которые можно просматривать с разрешения, текущий пользователь решает, утвердить ли квалифицированную операцию в соответствии со своей ролью. Если квалифицировано, установите
значение в поле статуса, обозначающее квалифицированный; конечно, если неквалифицированный, необходимо также установить значение, обозначающее неквалифицированный.
Это самый примитивный способ. Хотя управление процессом достигается через поле статуса, при изменении нашего процесса
написанный таким образом код тоже необходимо корректировать.
Итак, существует ли профессиональный способ управления рабочим процессом? И можно добиться того, что после изменения бизнес-процесса нашу программу не нужно будет менять.Если
этот эффект удастся достичь, то адаптивность нашей бизнес-системы значительно улучшится.
2. Обзор Activiti7
2.1 Введение
Программное обеспечение Alfresco объявило об официальном запуске проекта с открытым исходным кодом Activiti по управлению бизнес-процессами (BPM) 17 мая 2010 г. Его главным архитектором является Том Байенс, эксперт в области управления бизнес-процессами BPM
. оригинальный jbpm Architect, а jbpm — очень известный движок рабочих процессов, конечно,
activiti также является движком рабочих процессов.
Activiti - это механизм рабочих процессов. Activiti может извлекать сложные бизнес-процессы в бизнес-систему и
определять их с помощью специального языка моделирования BPMN2.0. Бизнес-процессы выполняются в соответствии с предопределенными процессами, а системные процессы реализуются с помощью Activiti снизить
рабочую нагрузку на бизнес-системы при обновлении систем из-за изменений процессов, тем самым повышая надежность системы и снижая затраты на разработку и обслуживание системы.
Официальный сайт: https://www.activiti.org/
вставьте сюда описание изображения
Опытная версия:
вставьте сюда описание изображения
Последняя версия: Activiti7.0.0.Beta
2.1.1 BPM
BPM (Business Process Management), то есть управление бизнес-процессами, представляет собой стандартизированную структуру, - Комплексные бизнес-процессы для постоянного повышения
эффективности бизнеса организации. BPM включен в общее образование по управлению бизнесом, такое как EMBA и MBA.
2.1.2 Программное обеспечение BPM
Программное обеспечение BPM — это ИТ-инструмент, который способствует интеграции и корректировке бизнес-
методов и решений между людьми, между людьми и системами, а также между системами в соответствии с изменениями бизнес-среды на предприятии.
Моделирование, автоматизация, управленческий мониторинг и оптимизация всего жизненного цикла внутренних и внешних бизнес-процессов предприятия с помощью программного обеспечения BPM позволяют снизить затраты предприятия и значительно увеличить прибыль
.
Программное обеспечение BPM широко используется на предприятиях.Везде, где есть бизнес-процессы, программное обеспечение BPM может использоваться для управления, например, управление кадровым офисом предприятия, управление процессами закупок, управление процессами утверждения официальных документов, управление
финансами и т. д.
2.1.3 БПМН
BPMN (Модель и нотация бизнес-процессов) — модель и нотации бизнес-процессов представляют собой
набор стандартных нотаций моделирования бизнес-процессов, разработанных BPMI (Инициатива по управлению бизнес-процессами), и бизнес-процессы могут создаваться с использованием нотаций, предоставляемых BPMN.
Спецификация BPMN1.0 была выпущена в мае 2004 года. BPMI была включена в организацию OMG (The Object Management Group) в сентябре 2005 года. OMG
выпустила финальную версию BPMN2.0 в январе 2011 года.
Конкретная история развития такова:
вставьте сюда описание изображения
BPMN в настоящее время является стандартом BPM, широко принятым поставщиками BPM. Activiti использует BPMN 2.0 для моделирования процессов и управления их выполнением.Он включает в себя
множество символов моделирования, таких как:
Событие
представлено кругом, что и происходит во время выполнения процесса.
вставьте сюда описание изображения
Действия представлены прямоугольниками с закругленными углами. Процесс состоит из одного действия или нескольких действий.
вставьте сюда описание изображения
Графика Bpmn фактически представляет бизнес-процессы через XML. Файл .bpmn выше открывается в текстовом редакторе:

<?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 Использование шагов
для развертывания activiti
Activiti — это механизм рабочего процесса (фактически набор API-интерфейсов jar-пакетов), бизнес-система может получать доступ (управлять) интерфейсом activiti, чтобы легко управлять
данными, связанными с процессом, так что среда рабочего процесса может быть интегрирована с среды бизнес-систем интегрированы.
Определение процесса
Используйте инструмент моделирования процессов activiti (конструктор действий) для определения бизнес-процессов (файлы .bpmn).
Файл .bpmn — это файл определения бизнес-процесса, который определяет бизнес-процесс через XML.
Развертывание определения процесса
Activiti развертывает определения бизнес-процессов (файлы .bpmn).
Используйте API, предоставленный activiti, для хранения содержимого определения процесса. Во время выполнения Activiti вы можете запросить определенное содержимое.
Activiti выполняет и сохраняет содержимое определения процесса в базе данных.
Запустите
экземпляр процесса. Экземпляр процесса также называется: ProcessInstance
запускает экземпляр процесса для начала бизнеса. Работа процесса.
После завершения развертывания определения процесса отпуска сотрудника, если Чжан Сан хочет попросить отпуск, он может запустить экземпляр процесса, а если Ли Си хочет попросить отпуск, он также может запустить экземпляр процесса и
выполнение эти два процесса не влияют друг на друга.
Пользователи запрашивают текущие задачи (Задача).
Поскольку бизнес-процесс системы был передан для управления activiti, через activiti вы можете запросить, где выполняется текущий процесс и какие
задачи необходимо выполнить текущему пользователю. Помогите нам справиться без необходимости. Разработчики пишут свои собственные запросы в операторах sql.
Пользователь решает задачи
После того, как пользователь запрашивает информацию об ожидающих задачах, он может выполнить определенную задачу. Если задача выполнена, ее должны выполнить другие пользователи. Например, после создания заказа на поставку он будет рассмотрен руководителем отдела. Этот процесс также дополняется
деятельностью для нас.
Конец процесса
Когда задача завершена и следующего узла задачи нет, экземпляр процесса завершается.

3. Среда Activiti
3.1 Среда разработки
Jdk1.8 или более поздняя версия
Mysql 5 и более поздняя версия
Tomcat8.5
IDEA
Примечание. Подключаемый модуль инструмента определения процессов Activiti можно установить в IDEA или инструмент Eclipse.
3.2 Среда Activiti
Мы используем: Activiti7.0.0.Beta1 по умолчанию поддерживает Spring5
3.2.1. Загрузите activiti7.
Адрес загрузки Activiti: http://activiti.org/download.html, зависимости Maven следующие:

<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. База данных:
    Для работы требуется поддержка базы данных.Поддерживаемые базы данных: h2, mysql, oracle, postgres, mssql, db2.

3.2.2 Установка дизайнера процессов в IDEA
Найдите подменю «Настройки» в меню «Файл» IDEA, а затем выберите меню «Плагины» слева, как показано на рисунке ниже: На этом этапе мы можем выполнить
вставьте сюда описание изображения
поиск плагина actiBPM. -в версии Activiti Designer для IDEA мы нажимаем «Установить», чтобы установить.
После установки страница такая:
вставьте сюда описание изображения
Подсказывает, что идею нужно перезапустить, нажимаем Перезапустить.
После завершения перезагрузки снова откройте Плагины (список плагинов) в разделе Настройки, справа нажмите Установленные (установленные плагины), и если вы увидите в списке actiBPM, это означает, что установка прошла успешно, как показано на рисунке. ниже: В
следующих
вставьте сюда описание изображения
курсах мы будем использовать этот дизайнер процессов для проектирования процессов Activiti.
3.3 Поддержка базы данных Activiti
Activiti нуждается в поддержке базы данных во время выполнения, использует 25 таблиц и считывает содержимое узла определения процесса в таблицу базы данных для последующего использования.
3.3.1 Базы данных, поддерживаемые Activiti
Базы данных и версии, поддерживаемые Activiti, следующие:
вставьте сюда описание изображения
3.3.2 Создание таблицы в MySQL
3.3.2.1 Создание базы данных
Создание базы данных mysql activiti (с любым именем):
CREATE DATABASE activiti DEFAULT CHARACTER SET utf8 ;
3.3.2.2 Использование кода Java Создать таблицу
1) Создать проект Java
Используйте идею для создания проекта Java Maven с именем: activiti01.
2) Добавьте координаты (пакет jar), от которых зависит maven.
Сначала вам нужно добавить пакет jar, необходимый ProcessEngine, в проект Java, включая:

  1. activiti-engine-7.0.0.beta1.jar 2) Пакеты jar, от которых зависит activiti: mybatis, alf4j, log4j и т. д.
  2. Весенний пакет, от которого зависит активность
  3. драйвер базы данных MySQL
  4. Сторонний пул подключений к данным dbcp 6) Юнит-тест Junit-4.12.jar
    Для реализации построения проекта мы используем maven, поэтому координаты, соответствующие этим jar-файлам, следует импортировать в файл pom.xml.
    Полные зависимости выглядят следующим образом:
<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数据转换 -->
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<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>

3) Добавьте конфигурацию журнала log4j.
Мы используем пакет журнала log4j для настройки журнала.
Создайте log4j.properties в разделе ресурсов.

# 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

4) Добавьте файл конфигурации activiti.
Мы используем метод по умолчанию, предоставленный activiti, для создания таблиц MySQL.
Требованием метода по умолчанию является создание файла activiti.cfg.xml в разделе resources . Примечание: каталог и имя файла метода по умолчанию не могут быть изменены, поскольку
установлен исходный код activiti, а файл с фиксированным имя файла считывается в фиксированном каталоге.

<?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>

5) Настройте в activiti.cfg.xml.
Методом по умолчанию является установка имени bean-компонента в activiti.cfg.xml какprocessEngineConfiguration. Имя не может быть изменено.
Здесь есть 2 метода настройки: один — настроить источник данных отдельно, а другой — «Не настраивать источники данных отдельно».

1. Непосредственная настройка процессаEngineConfiguration.
ProcessEngineConfiguration используется для создания ProcessEngine, и операции с базой данных будут выполняться при создании ProcessEngine.

<?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. После настройки источника данных обратитесь к ProcessEngineConfiguration и
сначала настройте источник данных.

<?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>

6) Программа написания класса Java для создания таблицы.
Создайте тестовый класс, вызовите класс инструмента activiti и сгенерируйте таблицу базы данных, необходимую для acitivti.
Непосредственное использование класса инструмента ProcessEngines, предоставленного activiti, по умолчанию прочитает файл activiti.cfg.xml по пути к классам, прочитает в нем конфигурацию базы данных
и создаст ProcessEngine. При создании ProcessEngine будет автоматически создана таблица.
код показан ниже:

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);
}
}

Инструкции: 1. Запустите приведенный выше сегмент программы, чтобы завершить создание таблицы activiti, и реализуйте
различные стратегии обработки таблицы данных, изменив значение параметра dataSchemaUpdate в activiti.cfg.xml. 2. При выполнении описанного выше метода getDefaultProcessEngine найдите фиксированное имяprocessEngineConfiguration
из activiti.cfg.xml.
Во время выполнения тестовой программы консоль idea выведет лог, указывающий, что программа создает таблицу данных, аналогичную следующей, обратите внимание на содержимое красной строки: после завершения выполнения
вставьте сюда описание изображения
проверяем базу данных и создадим таблицы 25. Результаты следующие:
вставьте сюда описание изображения
здесь мы завершим создание базы данных и таблиц, необходимых для работы.
3.4 Введение в структуру таблиц
3.4.1 Правила именования и функции таблиц
Просматривая только что созданные таблицы, мы обнаружили, что все таблицы Activiti начинаются с ACT_.
Вторая часть представляет собой двухбуквенное обозначение, обозначающее назначение стола. Цель также соответствует API сервиса. ACT_RE: «RE» означает репозиторий. Таблицы с этим префиксом
содержат определения процессов и статические ресурсы процессов (изображения, правила и т. д.). ACT_RU: «RU» означает время выполнения. Эти таблицы времени выполнения содержат
экземпляры процессов, задачи, переменные, асинхронные задачи и другие текущие данные. Activiti сохраняет эти данные только во время выполнения экземпляра процесса и
удаляет эти записи в конце процесса. Таким образом, таблица времени выполнения всегда может быть небольшой и быстрой. ACT_HI: «HI» означает историю. Эти таблицы содержат исторические данные, такие как
исторические экземпляры процессов, переменные, задачи и т. д. ACT_GE: GE означает общий. Общие данные, используемые в разных сценариях
3.4.2 Введение в таблицу данных Activiti
вставьте сюда описание изображения
4. Диаграмма отношений классов Activiti
Выше мы завершили создание таблицы базы данных Activiti, мы вызываем класс инструмента Activiti в Java-коде, давайте поймем связь классов Activiti
4.1 Диаграмма отношений классов
вставьте сюда описание изображения
В новой версии мы проводим эксперименты , можно обнаружить, что службы IdentityService и FormService были удалены.
Поэтому мы не будем объяснять эти две Службы позже, но в старой версии эти две Службы все еще есть.

4.2 activiti.cfg.xml
Файл конфигурации ядра activiti, включающий: определение ProcessEngineConfiguration, определение источника данных, менеджер транзакций и т. д. Этот файл на самом деле является файлом
конфигурации Spring.

4.3 Класс конфигурации механизма процесса
Класс конфигурации механизма процесса (ProcessEngineConfiguration), механизм рабочего процесса
ProceccEngine может быть создан с помощью ProcessEngineConfiguration, и обычно используются два метода:
4.3.1 StandaloneProcessEngineConfiguration
можно запускать отдельно с помощью StandaloneProcessEngineConfigurationActiviti для создания ProcessEngine, а Activiti будет обрабатывать транзакции самостоятельно.
Метод файла конфигурации:
обычно в файле конфигурации activiti.cfg.xml определяется компонент с идентификатором ProcessEngineConfiguration.
Метод заключается в следующем:

<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>

Вы также можете присоединиться к пулу соединений:

<?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 SpringProcessEngineConfiguration
интегрируется со Spring через org.activiti.spring.SpringProcessEngineConfiguration.
Создайте интегрированный файл конфигурации для Spring и Activiti:
Activity-spring.cfg.xml (имя можно изменить)

<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" factorymethod="getHistoryService" />
<!-- 用户管理service -->
<bean id="identityService" factory-bean="processEngine" factorymethod="getIdentityService" />
<!-- 引擎管理service -->
<bean id="managementService" factory-bean="processEngine" factorymethod="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>

Создать конфигурацию процессаEngineConfiguration

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

Приведенный выше код требует, чтобы в activiti.cfg.xml был компонент ProcessEngineConfiguration.
Вы также можете использовать следующий метод, чтобы изменить имя компонента:

ProcessEngineConfiguration.createProcessEngineConfigurationFromResource(String resource,
String beanName);

4.4 Создание механизма рабочего процесса
Механизм рабочего процесса (ProcessEngine) эквивалентен интерфейсу фасада. ProcessEngine создается с помощью ProcessEngineConfiguration, а
каждый сервисный интерфейс создается с помощью ProcessEngine.
4.4.1 Метод создания по умолчанию.
Исправьте имя и путь к файлу activiti.cfg.xml, а файл activiti.cfg.xml имеет конфигурациюprocessEngineConfiguration.
Для создания ProcessEngine можно использовать следующий код:

//直接使用工具类 ProcessEngines,使用classpath下的activiti.cfg.xml中的配置创建processEngine
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
System.out.println(processEngine);

4.4.2 Общий метод создания

//先构建ProcessEngineConfiguration
ProcessEngineConfiguration configuration =
ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml");
//通过ProcessEngineConfiguration创建ProcessEngine,此时会创建数据库
ProcessEngine processEngine = configuration.buildProcessEngine();

4.5 Интерфейс службы Servcie
Служба — это интерфейс службы, предоставляемый механизмом рабочего процесса для развертывания, выполнения и управления рабочим процессом. Мы можем использовать эти интерфейсы для соответствия таблице данных
операционной службы.
4.5.1 Метод создания службы Метод создания службы
через ProcessEngine
выглядит следующим образом:

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

4.5.2 Обзор службы
вставьте сюда описание изображения
Краткое введение:
RepositoryService
— это класс управления ресурсами activiti, который предоставляет операции для управления и контроля пакетов выпусков процессов и определений процессов. Бизнес-блок-схема, созданная с помощью инструмента моделирования рабочих процессов, должна
использовать эту службу для развертывания содержимого файла определения процесса на компьютере.
Помимо развертывания определений процессов вы также можете: Запросить пакет выпуска и определение процесса в ядре. Класс управления операциями процесса
RuntimeService Activiti.
Вы можете получить много информации о выполнении процесса из класса управления задачами этого класса обслуживания
TaskService
Activiti. Информацию о задаче можно получить из этого класса.
Класс управления историей HistoryService
Activiti может запрашивать историческую информацию.Когда процесс выполняется, движок сохраняет много данных (в соответствии с конфигурацией), таких как
время каждого экземпляра процесса и т. д. Этот сервис получает эти данные в основном через функцию запроса
.
Класс управления механизмом ManagementService
Activiti предоставляет функции управления и обслуживания для механизма процессов Activiti. Эти функции не используются в приложениях, управляемых рабочими процессами, и в
основном используются для ежедневного обслуживания системы Activiti.
5. Начало работы с Activiti
В этой главе давайте создадим рабочий процесс Activiti и запустим его.
Создание рабочего процесса Activiti в основном включает в себя следующие шаги:
1. Определите процесс в соответствии со спецификацией BPMN, используйте инструмент определения процесса, чтобы описать весь процесс с помощью символов процесса. 2.
Разверните процесс, загрузите нарисованный файл определения процесса в базу данных и сгенерируйте табличные данные.
3. Запустите процесс. , Используйте код Java для управления содержимым таблицы базы данных.
5.1 Нотация процесса
BPMN 2.0 — это аббревиатура нотации моделирования бизнес-процессов 2.0.
Он был создан и постоянно развивается некоммерческой ассоциацией Business Process Management Initiative. Следует отметить, что BPMN 2.0 представляет собой
набор спецификаций обозначений, в которых используются некоторые символы для пояснения блок-схемы проектирования бизнес-процессов, что может повысить эффективность коммуникации при бизнес-моделировании.
На данный момент BPMN2.0 является последней версией, которая используется для верстки и визуальной коммуникации в контексте BPM.
Далее, давайте сначала разберемся с общими символами в проектировании процессов.
Базовое соответствие BPMN2.0 в основном включает в себя:

Событие Событие
вставьте сюда описание изображения
Активность
Активность — это общий термин для работы или задач. Активность может быть задачей или подпроцессом текущего процесса; во-вторых, вы
также можете указать разные типы активности. Общие действия следующие: Шлюзы
вставьте сюда описание изображения
Шлюзы GateWay
используются для обработки решений, необходимо знать несколько часто используемых шлюзов:
вставьте сюда описание изображения
Эксклюзивный шлюз (x)
— будет выбран только один путь. Когда процесс достигнет шлюза, он будет рассчитываться один за другим в соответствии с порядком выходных потоков. Когда результат расчета условия верен, выходной поток
текущего шлюза будет продолжать выполняться;
если результат расчета из нескольких строк являются истинными, будет выполнено первое значение. Если ни один из результатов оценки шлюза не соответствует действительности, механизм выдаст
исключение.
Эксклюзивный шлюз необходимо использовать в сочетании с условным потоком операций. Атрибут по умолчанию определяет поток операций по умолчанию. Если все условия не выполнены, будет выполнен поток операций по умолчанию.
Параллельный шлюз (+)
— все пути будут выбраны одновременно.
Разделение — все исходящие потоки операций выполняются параллельно, создавая параллельную линию выполнения для каждого потока операций.
Слияние — все строки, которые отделяются от параллельного шлюза и выполняются, ждут здесь, пока все строки не будут выполнены, прежде чем продолжить выполнение вниз.
Инклюзивный шлюз (+)
— может выполнять несколько строк одновременно или задавать условия для шлюза.
Разделить — оценивать выражение в каждой строке, когда выражение оценивается как истинное, создать параллельную строку и продолжить выполнение.
Объединить — — Все строки, которые отделяются от параллельного шлюза и выполняются, ждут здесь, пока все строки не будут выполнены, прежде чем продолжить выполнение вниз.
Шлюз событий(+)
—— Специально настроен для промежуточных событий захвата, позволяя нескольким потокам вывода указывать на несколько различных промежуточных событий захвата. Когда процесс выполняется в шлюзе событий, процесс
находится в состоянии ожидания, и ему необходимо дождаться создания события, чтобы преобразовать состояние ожидания в активное состояние.
Поток к Потоку
— это линия, соединяющая два узла процесса. Общие направления потока включают в себя следующее:
вставьте сюда описание изображения
5.2 Дизайнер процессов Используйте
Activiti-Designer для использования
палитры (рисовальной доски)
для установки плагинов в идею и ее использования. Чертежная доска включает в себя следующие узлы:
Соединение —
Событие соединения — Задача события
— Задача
Шлюз —
Контейнер шлюза —
Контейнер Граничное событие — Граничное событие
Промежуточное событие — Промежуточное событие
После разработки блок-схемы сохраните и сгенерируйте файл .bpmn. Чтобы создать
новый процесс (инструмент IDEA),
сначала выберите каталог, в котором хранятся графики. (выберите каталог bpmn в разделе «Ресурсы») и щелкните меню: «Создать» -> «BpmnFile», как показано на рисунке: появится
вставьте сюда описание изображения
окно, показанное на рисунке ниже, введите «evection», чтобы указать процесс утверждения командировки:
вставьте сюда описание изображения
после имени «evection» ( расширение по умолчанию — bpmn), вы можете увидеть страницу проектирования процесса, как показано на рисунке:
вставьте сюда описание изображения
левая область — это область рисования, область справа — область доски для рисования палитры.
Щелкните элементы доски для рисования с помощью значка мышь, чтобы нарисовать слева.
Процесс рисования.
Используйте скейтборд, чтобы нарисовать процесс. Перетащив значок справа на доску для рисования слева, конечный результат будет следующим:
вставьте сюда описание изображения
Укажите ключ определения процесса.Ключ
определения процесса — это идентификатор определения процесса.Просмотрите ключ процесса в представлении свойств.Укажите
вставьте сюда описание изображения
руководителя задачи.В
представлении свойств укажите ответственного за каждый узел задачи.Для Например, лицо, ответственное за заполнение
вставьте сюда описание изображения
заявления о командировке, — менеджер Чжансан. Джерри
 – генеральный менеджер, а лицо, отвечающее за утверждение — Джек.
Лицо, отвечающее за финансовое утверждение – Роуз.
6. Операция процесса
6.1 Определение процесса
Обзор
Определение процесса заключается в описании бизнес-процесса в автономном режиме по стандарту bpmn2.0. Обычно плагин в идее используется для моделирования бизнес-процесса.
Используйте конструктор согласно идее, чтобы нарисовать процесс, и будут созданы два файла:
файлы .bpmn и .png.bpmn
. Используйте activiti-desinger для проектирования бизнес-процессов, и будут созданы файлы .bpmn. Мы создали файл bpmn
BPMN. 2.0 root Узел является узлом определений. В этом элементе можно определить несколько определений процессов (но мы рекомендуем, чтобы каждый файл содержал только одно определение процесса
, что может упростить обслуживание в процессе разработки). Обратите внимание, что элемент определений должен содержать как минимум объявления xmlns и targetNamespace.
targetNamespace может быть любым значением, оно используется для классификации экземпляра процесса.
Часть определения процесса: определяет описание каждого узла процесса и потока процесса между узлами.
Определение схемы процесса: определите такую ​​информацию, как координаты положения каждого узла процесса на блок-схеме.
Как создать файлы изображений .png
в инструменте IDEA
1. Измените суффикс файла на xml.
Сначала переименуйте файл evection.bpmn в evection.xml, как показано на рисунке ниже:
вставьте сюда описание изображения
Файл bpmn до изменения evection.xml, эффект следующий:
вставьте сюда описание изображения
2. Используйте дизайнер, чтобы откройте файл .xml
над файлом evection.xml, щелкните правой кнопкой мыши и выберите меню «Диаграммы», затем выберите «Показать BPMN2.0 Designer…»
вставьте сюда описание изображения
3. Просмотрите открытый файл.
После открытия присутствуют искаженные символы, как показано на рисунке. :
вставьте сюда описание изображения
4. Устраните искаженные китайские символы
1. Откройте «Настройки», найдите «Кодировки файлов» и установите параметр кодировки. Выберите UTF-8 для
вставьте сюда описание изображения
обоих. 2. Откройте путь установки IDEA и найдите следующий каталог установки. Это
вставьте сюда описание изображения
зависит от установленной вами версии. Я использую 64-битную версию idea, поэтому в последнюю строку файла idea64.exe.vmoptions добавьте команду:
-Dfile.encoding=UTF-8
:
вставьте сюда описание изображения
Будьте осторожны, чтобы не было пробелов, иначе она не откроется при IDEA перезапускается, а затем перезапускает IDEA.
Если описанный выше метод был выполнен, а искаженные символы все еще появляются, измените другой файл и добавьте: -Dfile.encoding=UTF-8 в конце файла, затем перезапустите
идею, как показано на рисунке:
вставьте сюда описание изображения
Наконец, нажмите на удаление. Снова щелкните файл .xml. Щелкните правой кнопкой мыши и выберите меню «Диаграммы», а затем выберите «Показать BPMN2.0 Designer...», чтобы увидеть сгенерированное изображение,
как показано на рисунке:
вставьте сюда описание изображения
5. Экспортируйте как файл изображения.
Щелкните маленький значок «Экспорт в файл», чтобы открыть следующее окно, обратите внимание на то, чтобы заполнить имя и расширение файла, а также выбрать место для сохранения изображения: Затем
вставьте сюда описание изображения
мы копируем файл PNG в каталог bpmn в разделе «Ресурсы» и переименовываем его. evection.xml в vection.bpmn.


6.2 Обзор развертывания определения процесса
Развертывание процесса, определенного выше в конструкторе, в базе данных activiti представляет собой развертывание определения процесса.
Добавьте и разверните файлы bpmn и png определения процесса в activiti один за другим, вызывая API activiti, или упакуйте два файла в ZIP-пакет
для развертывания.
Метод развертывания с помощью одного файла
Развертывайте файлы bpmn и файлы изображений png отдельно.

import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.repository.Deployment;
import org.junit.Test;
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());
}
}

После выполнения этой операции activiti сохранит файл bpm и файл изображения, указанные в приведенном выше коде, в базе данных activiti.
Метод развертывания сжатого пакета.
Сожмите файлы event.bpmn и event.png в 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());
}

После выполнения этой операции activiti сохранит файл bpm и файл изображения, указанные в приведенном выше коде, в базе данных activiti.
Таблица операционных данных.
Три таблицы для операционной деятельности после развертывания определения процесса:
таблица развертывания определения процесса act_re_deployment, добавьте запись для каждого развертывания
таблица определения процесса act_re_procdef, развертывание каждого нового определения процесса добавит запись в эту таблицу
процесс act_ge_bytearray таблица ресурсов
Далее давайте посмотрим, какие данные записываются:

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

вставьте сюда описание изображения

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

Результат:
Обратите внимание, что поле KEY — это ключевое слово, используемое для уникальной идентификации различных процессов.
вставьте сюда описание изображения

 SELECT * FROM act_ge_bytearray #资源表

Результат:
Обратите внимание, что поле KEY — это ключевое слово, используемое для уникальной идентификации различных процессов.
вставьте сюда описание изображения

SELECT * FROM act_ge_bytearray #资源表

вставьте сюда описание изображения
Примечание.
Между act_re_deployment и act_re_procdef существует связь «один ко многим». Одно развертывание создает одну запись в таблице развертывания процессов, но одно развертывание может развертывать несколько определений процессов,
и каждое определение процесса создает запись в таблице определений процессов. Каждое определение процесса будет иметь две записи ресурсов в act_ge_bytearray, bpmn
и png.
Предложение: развертывайте по одному процессу за раз, чтобы таблица развертывания и таблица определения процесса имели отношение один к одному, что удобно для чтения информации о развертывании процесса и определении процесса.
6.3 Запуск экземпляра процесса
После того, как определение процесса развернуто в activiti, бизнес-процессом можно управлять посредством рабочего процесса, то есть можно использовать развернутый выше процесс подачи заявки на командировку.
1 SELECT * FROM act_re_deployment #Таблица развертывания определения процесса, запись информации о развертывании процесса
1 SELECT * FROM act_re_procdef #Таблица определения процесса, запись информации об определении процесса
1 SELECT * FROM act_ge_bytearray #Resource table
Для этого процесса запуск процесса означает начало новой командировки Форма приложения, которая эквивалентна связи между классом Java и объектом Java. После определения класса вам необходимо создать
объект с новым. Конечно, вы можете создать несколько новых объектов. Для процесса подачи заявления на командировку Чжан Сану необходимо запустить экземпляр процесса,
когда он инициирует форму заявления на командировку, а экземпляр процесса необходимо запустить, когда форма заявления на командировку инициирует заказ на командировку.
код показан ниже:

/**
* 启动流程实例
*/
@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());
}

вставьте сюда описание изображения
Таблица данных операций
act_hi_actinst история выполнения экземпляра
процесса act_hi_identitylink историческая информация об участвующем в
процессе пользователе act_hi_procinst историческая информация об экземпляре
процесса act_hi_taskinst историческая информация о задаче
процесса act_ru_execution информация о выполнении процесса
act_ru_identitylink информация об участвующем в процессе пользователе
act_ru_task информация о задаче

6.4 Запрос задачи
После запуска процесса лицо, отвечающее за задачу, может запросить задачи, которые ему необходимо обработать в данный момент, и все запрашиваемые задачи являются задачами пользователя.

/**
* 查询当前个人待执行的任务
*/
@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());
}
}

Вывод следующий:

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

6.5 Обработка задач обработки
Руководитель задач запрашивает ожидающие задачи, выбирает задачи для обработки и завершает задачи.

// 完成任务
@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 Запрос информации об определении процесса
. Запрос информации, связанной с процессом, включая определение процесса, развертывание процесса и версию определения процесса.

/**
* 查询流程定义
*/
@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());
}
}

Результат вывода:
вставьте сюда описание изображения

6.7 Удаление процесса

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);
}

проиллюстрировать:

  1. Используйте репозиторийService, чтобы удалить определение процесса, и информация таблицы истории не будет удалена.
  2. Если в определении процесса нет запущенного процесса, его можно удалить обычным способом.
    Если в определении процесса уже есть запущенный процесс, используйте общее удаление, чтобы сообщить об ошибке, и используйте метод каскадного удаления, чтобы удалить все процессы и связанные записи.
    Сначала удалите незавершенные узлы процесса и, наконец, полностью удалите информацию об определении процесса.Операция
    каскадного удаления при разработке проекта обычно доступна только суперадминистраторам.

6.8 Загрузка ресурсов процесса
Теперь наши файлы ресурсов процесса загружены в базу данных. Если другие пользователи захотят просмотреть эти файлы ресурсов, они смогут загрузить файлы ресурсов из базы данных в локальную папку
.
Решения:
1. jdbc считывает данные типа blob и типа clob и сохраняет их в каталоге файлов
2. Для реализации используйте API activiti.
Используйте commons-io.jar для решения операции ввода-вывода.
Внедрите пакет зависимостей commons-io.

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

Получите ресурсы определения процесса через объекты определения процесса, получите bpmn и png

@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();
}

проиллюстрировать:

  1. DeploymentId — идентификатор развертывания процесса.
  2. имя_ресурса — это значение столбца NAME_ в таблице act_ge_bytearray.
  3. Используйте метод getDeploymentResourceNames службы репозитория, чтобы получить имена всех файлов в указанном развертывании.

  4. Используйте метод getResourceAsStream службы репозитория, чтобы передать идентификатор развертывания и имя изображения ресурса, чтобы получить входной поток файла с указанным именем в развертывании и,
    наконец, вывести ресурс изображения во входной поток.

6.9 Просмотр информации истории процесса
Даже если определение процесса было удалено, историческая информация о выполнении процесса по-прежнему сохраняется в таблицах активности, связанных с act_hi_*, в результате предыдущего анализа. Таким образом, мы
по-прежнему можем запрашивать историческую информацию о выполнении процесса и просматривать связанные исторические записи через HistoryService.

/**
* 查看历史信息
*/
@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("<==========================>");
}
}

Supongo que te gusta

Origin blog.csdn.net/weixin_45817985/article/details/132639431
Recomendado
Clasificación