Wexflow – открытый исходный код .NET Workflow Engine

Открытый инструмент для автоматизации рабочих процессов на платформе .NET с открытым исходным кодом.

Содержание

  1. Введение
  2. Особенности
  3. Установка
  4. Docker
  5. Конфигурация
  6. Провайдеры сохранения
  7. Начало работы
  8. Android-приложение
  9. Примеры
  10. Встроенные активности
  11. Локальные переменные
  12. Глобальные переменные
  13. Планирование Cron
  14. Логирование
  15. Пользовательские активности
  16. Клиент командной строки
  17. RESTful API
  18. Запуск из исходного кода
  19. История

Введение

Wexflow – это кросс-платформенный движок рабочих процессов и платформа автоматизации, которая позволяет автоматизировать повторяющиеся задачи. С помощью Wexflow построение автоматизации и рабочих процессов становится легким.

Wexflow предоставляет кросс-платформенный сервер рабочих процессов, интерфейс для проектирования, управления и отслеживания рабочих процессов, последовательные рабочие процессы, рабочие процессы на основе блок-схем и рабочие процессы согласования на общих объектах бизнеса, называемых записями.

Wexflow предлагает более 100 активностей для различных видов задач и позволяет настраивать интеграцию с другими решениями через пользовательские активности и Wexflow API.

Особенности

Wexflow предоставляет следующие возможности:

  • Кросс-платформенный сервер рабочих процессов
  • Мощная серверная часть
  • HTML5-дизайнер
  • Нативное Android-приложение
  • Последовательные рабочие процессы
  • Рабочие процессы на основе блок-схем
  • Рабочие процессы согласования
  • Более 100 активностей
  • Планирование Cron
  • Обширное логирование
  • Статистика в реальном времени
  • Поддержка нескольких языков
  • RESTful API
  • Расширяемость

Панель управления позволяет получить красивый обзор происходящего в Wexflow с помощью статистики в реальном времени:

Изображение 1

HTML5-дизайнер позволяет создавать рабочие процессы с легкостью. Просто перетаскивайте задачи одну на другую:

Менеджер позволяет просматривать и управлять выполняющимися экземплярами ваших рабочих процессов:

Журналы позволяют получить красивый обзор происходящего в Wexflow.

Android-приложение позволяет просматривать и управлять вашими рабочими процессами:

Установка

Установка Wexflow проста и требует нулевой конфигурации. Ее можно установить и настроить всего за несколько секунд.

В этом разделе показано, как установить версию .NET на Windows, а также как установить версию .NET Core на Windows, Linux или macOS.

Windows (.NET)

  1. Установите .NET Framework 4.8
  2. Скачайте последнюю версию Wexflow.
  3. Щелкните правой кнопкой мыши по установщику, выберите Свойства, установите флажок Разблокировать, а затем нажмите ОК.
  4. Запустите установщик и следуйте инструкциям.

После установки Wexflow будет запущена служба Windows с именем Wexflow, которая запускается автоматически.

В меню пуск добавлены следующие пункты меню:

  • Меню “Backend” открывает бэкэнд.
  • Меню “Configuration” открывает папку конфигурации Wexflow.
  • Меню “Documentation” открывает папку с документацией Wexflow.
  • Меню “Logs” открывает файл журнала за день.
  • Меню “Manager” открывает графический интерфейс управления Wexflow.
  • Меню “Install SQLite samples” устанавливает образцы рабочих процессов SQLite.
  • Меню “Install MongoDB samples” устанавливает образцы рабочих процессов MongoDB.
  • Меню “Install SQL Server samples” устанавливает образцы рабочих процессов SQL Server.
  • Меню “Install PostgreSQL samples” устанавливает образцы рабочих процессов PostgreSQL.
  • Меню “Install MySQL samples” устанавливает образцы рабочих процессов MySQL.
  • Меню “Install LiteDB samples” устанавливает образцы рабочих процессов LiteDB.
  • Меню “Install Oracle samples” устанавливает образцы рабочих процессов Oracle.

Вот учетные данные для входа в бэкэнд или Wexflow Manager:

  • Имя пользователя: admin
  • Пароль: wexflow2018

После входа в систему вы можете изменить пароль в бэкэнде.

Если вы хотите, вы можете разместить бэкэнд на веб-сервере.

Вы можете выбрать из 7 провайдеров сохранения данных:

  • SQLite (По умолчанию)
  • MongoDB
  • SQLServer
  • PostgreSQL
  • MySQL
  • LiteDB
  • Oracle

Чтобы узнать, как изменить провайдера сохранения данных, посмотрите на странице конфигурации.

Чтобы установить бэкэнд на веб-сервер, просто скопируйте содержимое папки C:\Program Files\Wexflow\Backend\ на веб-сервер. Если вы хотите установить бэкэнд на другой компьютер, просто отредактируйте файл конфигурации js/settings.js:

window.Settings = (function () {    const hostname = (window.location.hostname === "" ? "localhost" : window.location.hostname);    const port = 8000;    return {        Hostname: hostname,        Port: port,        Uri: "http://" + hostname + ":" + port + "/api/v1/"    };})();

Вместо hostname укажите IP-адрес или DNS-имя компьютера, на котором установлен сервер Wexflow. Убедитесь, что порт 8000 открыт в брандмауэре. Вы также можете изменить port, если Wexflow работает на порте, отличном от 8000.

Windows (.NET Core)

  1. Скачайте и установите ASP.NET Core 8.0 Runtime
  2. Скачайте и распакуйте пакет .NET Core Wexflow
  3. Дважды нажмите на “install.bat”, чтобы установить файлы конфигурации Wexflow

Это всё. Дважды щелкните на “run.bat”, чтобы запустить сервер рабочих процессов Wexflow

Чтобы открыть бэкэнд, перейдите в папку “Backend” и дважды щелкните на файле “index.html”.

Учетные данные такие же, как указано в разделе Windows .NET.

Если вы хотите, вы можете разместить бэкэнд /opt/wexflow/Backend/ на веб-сервере.

Linux (.NET Core)

  1. Скачайте и установите ASP.NET Core 8.0 Runtime
  2. Скачайте и распакуйте пакет .NET Core Wexflow в /opt/
  3. Добавьте разрешения:
sudo chown -R $USER:$USER /opt/wexflowsudo chmod +x /opt/wexflow/install.sh
  1. Установите службу systemd Wexflow:
sudo /opt/wexflow/install.sh

Вот и всё. Wexflow установлен. Swagger доступен по адресу: http://<hostname>:8000

Теперь установим бэкэнд на NGINX.

Сначала установите NGINX:

sudo apt updatesudo apt install nginx-full

Затем добавьте бэкэнд в NGINX:

sudo nano /etc/nginx/sites-enabled/default

Добавьте следующую конфигурацию:

server {    listen 8011;    root /opt/wexflow/Backend;    index index.html;    access_log /var/log/nginx/wexflow.access.log;    error_log /var/log/nginx/wexflow.error.log;    location / {        # Сначала попытаться обслужить запрос в качестве файла, затем как каталог,        # затем как index.html, затем перейти к 404 ошибке.        try_files $uri $uri/ /index.html =404;    }}

Проверьте конфигурацию NGINX и, если все успешно, перезапустите NGINX:

sudo nginx -tsudo systemctl restart nginx.service

Вот и всё! Бэкэнд установлен и доступен по адресу: http://<hostname>:8011

Учетные данные такие же, как указано в разделе Windows .NET.

Если вы хотите установить бэкэнд на другой компьютер, вам потребуется отредактировать файл конфигурации js/settings.js:

window.Settings = (function () {    const hostname = (window.location.hostname === "" ? "localhost" : window.location.hostname);    const port = 8000;    return {        Hostname: hostname,        Port: port,        Uri: "http://" + hostname + ":" + port + "/api/v1/"    };})();

Вместо hostname укажите IP-адрес или DNS-имя компьютера, на котором установлен сервер Wexflow. Проверьте, что порт 8000 открыт в брандмауэре. Вы также можете изменить port, если Wexflow работает на порту, отличном от 8000.

Если вы хотите использовать провайдер постоянства MongoDB persistence provider, вам необходимо обновить файл /opt/wexflow/wexflow.service следующим образом:

[Unit]Description=wexflowWants=mongod.serviceAfter=mongod.service[Service]ExecStart=/usr/bin/dotnet Wexflow.Server.dllWorkingDirectory=/opt/wexflow/Wexflow.Server[Install]WantedBy=multi-user.target

Затем выполните команду install.sh снова:

sudo /opt/wexflow/install.sh

Если вы хотите использовать провайдер постоянства SQLServer, MySQL, PostgreSQL или Oracle, убедитесь, что вы обновили параметры Wants= и After= с соответствующими службами.

Если вы хотите обновить Wexflow до новой версии, выполните следующие действия:

  1. Создайте резервную копию папки Wexflow в /opt/wexflow/Wexflow
  2. Удалите /opt/wexflow
  3. Скачайте и распакуйте пакет .NET Core Wexflow в /opt/
  4. Скопируйте папку Wexflow, которую вы сохранили в /opt/wexflow
  5. Установите права доступа:
sudo chown -R $USER:$USER /opt/wexflowsudo chmod +x /opt/wexflow/install.sh
  1. Обновите и перезапустите службу systemd Wexflow:
sudo /opt/wexflow/install.sh

Вот и всё. Wexflow обновлен.

macOS (.NET Core)

  1. Скачайте и установите Среду выполнения ASP.NET Core 8.0
  2. Скачайте и распакуйте пакет .NET Core Wexflow в /Applications/

Вот и все. Вы можете запустить Wexflow следующим образом:

cd /Applications/wexflow/Wexflow.Serverdotnet Wexflow.Server.dll

Вы можете открыть бэкэнд, открыв /Applications/wexflow/Backend/index.html в браузере.

Учетные данные такие же, как указано в разделе Windows .NET.

Docker

Этот раздел описывает, как создать и запустить образ Docker для Wexflow.

unzip wexflow-linux-netcore.zip

Вашей текущей папке будет создана папка ./wexflow/.

  • Скачайте файлы Dockerfile и docker-compose.yml и скопируйте их в вашу текущую папку (рядом с папкой wexflow). Структура папок должна выглядеть так:
|-- ./|-- ./wexflow/|-- ./Dockerfile|-- ./docker-compose.yml
  • Выполните следующую команду в вашей текущей папке:
docker compose up

Папка ./wexflow/ будет смонтирована во время сборки, поэтому вы можете иметь доступ к папке конфигурации ./wexflow/Wexflow и добавлять пользовательские задачи и их ссылки во время выполнения, получать доступ к файлам журнала и изменять конфигурацию по вашему усмотрению.

Таким образом, Wexflow запустится, а бэкэнд будет доступен по адресу: http://localhost:8011/

Если вы уже развернули образ Wexflow и хотите обновиться до другой версии, выполните следующие команды, чтобы убедиться, что вы получаете все обновленные функции:

docker compose build --no-cachedocker compose up

Если вы хотите использовать MongoDB вместо SQLite, следуйте инструкциям в файле docker-compose.yml.

Конфигурация

Wexflow не требует настройки. Однако, если вы хотите изменить конфигурацию, вы можете ознакомиться с этим разделом.

Wexflow Server

.NET

Вы можете настроить Wexflow Server в файле C:\Program Files\Wexflow\Wexflow.Server.exe.config:

<?xml version="1.0" encoding="utf-8"?><configuration>  <configSections>    <section name="log4net"      type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>  </configSections>  <appSettings>    <add key="WexflowSettingsFile" value="C:\Wexflow\Wexflow.xml"/>    <!-- LogLevel: Debug | All | Severely | Minimum | None -->    <add key="LogLevel" value="All"/>    <add key="WexflowServicePort" value="8000"/>    <add key="SuperAdminUsername" value="admin"/>    <add key="EnableWorkflowsHotFolder" value="false"/>    <add key="EnableRecordsHotFolder" value="true"/>    <add key="EnableEmailNotifications" value="false"/>    <add key="DateTimeFormat" value="dd-MM-yyyy HH:mm:ss"/>    <add key="Smtp.Host" value="smtp.gmail.com"/>    <add key="Smtp.Port" value="587"/>    <add key="Smtp.EnableSsl" value="true"/>    <add key="Smtp.User" value="user"/>    <add key="Smtp.Password" value="password"/>    <add key="Smtp.From" value="user"/>    <add key="ClientSettingsProvider.ServiceUri" value=""/>  </appSettings>  <log4net>    <appender name="RollingFile" type="log4net.Appender.RollingFileAppender">      <file value="Wexflow.log"/>      <encoding value="utf-8"/>      <appendToFile value="true"/>      <rollingStyle value="Date"/>      <datePattern value="yyyyMMdd"/>      <layout type="log4net.Layout.PatternLayout">        <conversionPattern value="%date %5level [%thread] - %message%newline"/>      </layout>    </appender>    <root>      <level value="INFO"/>      <appender-ref ref="RollingFile"/>    </root>  </log4net>  ...</configuration>

Опции LogLevel:

  • Debug: Все логи и отладочные логи
  • All: Все логи без отладочных логов (По умолчанию)
  • Severely: Только последний журнал рабочего процесса и ошибочные логи
  • Minimum: Только последний журнал рабочего процесса
  • None: Без логов

.NET Core

Вы можете настроить Wexflow Server из Wexflow.Server/appsettings.json:

{  "WexflowSettingsFile": "C:\\Wexflow-netcore\\Wexflow.xml",  "LogLevel": "All",  "WexflowServicePort": 8000,  "SuperAdminUsername": "admin",  "EnableWorkflowsHotFolder": false,  "EnableRecordsHotFolder": true,  "EnableEmailNotifications": false,  "DateTimeFormat": "dd-MM-yyyy HH:mm:ss", /* Формат даты и времени на сервере. */  "Smtp.Host": "smtp.gmail.com",  "Smtp.Port": 587,  "Smtp.EnableSsl": true,  "Smtp.User": "user",  "Smtp.Password": "password",  "Smtp.From": "user"}

Wexflow.xml

Wexflow.xml является основным файлом конфигурации сервера Wexflow. Путь к нему может быть настроен из C:\Program Files\Wexflow\Wexflow.Server.exe.config для версии .NET и из Wexflow.Server\appsettings.json для версии .NET Core.

.NET

Ниже приведен файл конфигурации Wexflow.xml для версии .NET:

<?xml version="1.0" encoding="UTF-8" ?><Wexflow>  <Setting name="workflowsFolder" value="C:\Wexflow\Workflows" />  <Setting name="recordsFolder" value="C:\Wexflow\Records" />  <Setting name="recordsHotFolder" value="C:\Wexflow\Records\_HotFolder" />  <Setting name="tempFolder" value="C:\Wexflow\Temp" />  <Setting name="tasksFolder" value="C:\Wexflow\Tasks" />  <Setting name="approvalFolder" value="C:\Wexflow\Approval" />  <Setting name="xsd" value="C:\Wexflow\Workflow.xsd" />  <Setting name="tasksNamesFile" value="C:\Wexflow\TasksNames.json" />  <Setting name="tasksSettingsFile" value="C:\Wexflow\TasksSettings.json" />  <Setting name="globalVariablesFile" value="C:\Wexflow\GlobalVariables.xml" />  <!-- SQLite или MongoDB или SQLServer или PostgreSQL или MySQL или LiteDB или Oracle -->  <Setting name="dbType" value="SQLite" />  <!-- SQLite -->  <Setting name="connectionString" value="Data Source=C:\Wexflow\Database\Wexflow.sqlite;Version=3;" />  <!-- MongoDB -->  <!--<Setting name="connectionString" value="Database=wexflow;MongoUrl=mongodb://localhost:27017;EnabledSslProtocols=false;SslProtocols=None" />-->  <!-- SQLServer -->  <!--<Setting name="connectionString" value="Server=localhost;Trusted_Connection=True;Database=wexflow;" />-->  <!-- PostgreSQL -->  <!--<Setting name="connectionString" value="Server=127.0.0.1;User Id=postgres;Password=pwd;Database=wexflow;Port=5432" />-->  <!-- MySQL -->  <!--<Setting name="connectionString" value="Server=localhost;Database=wexflow;Uid=root;Pwd=pwd;Port=3306" />-->  <!-- LiteDB -->  <!--<Setting name="connectionString" value="Filename=C:\Wexflow\Database\Wexflow.db; Connection=direct" />-->  <!-- Oracle -->  <!--<Setting name="connectionString" value="Data Source=localhost:1521/wexflow;User Id=SYSTEM;Password=pwd;" />--></Wexflow>

Wexflow поддерживает 7 поставщиков хранения данных. Вы можете выбрать из следующих вариантов dbType:

  • SQLite (По умолчанию)
  • MongoDB
  • SQLServer
  • PostgreSQL
  • MySQL
  • LiteDB
  • Oracle

Если вы измените поставщика хранения данных, не забудьте обновить параметр connectionString.

.NET Core

Windows

Внизу приведен файл конфигурации Wexflow.xml для версии .NET Core:

<?xml version="1.0" encoding="UTF-8" ?><Wexflow>  <Setting name="workflowsFolder" value="C:\Wexflow-netcore\Workflows" />  <Setting name="recordsFolder" value="C:\Wexflow-netcore\Records" />  <Setting name="recordsHotFolder" value="C:\Wexflow-netcore\Records\_HotFolder" />  <Setting name="tempFolder" value="C:\Wexflow-netcore\Temp" />  <Setting name="tasksFolder" value="C:\Wexflow-netcore\Tasks" />  <Setting name="approvalFolder" value="C:\Wexflow-netcore\Approval" />  <Setting name="xsd" value="C:\Wexflow-netcore\Workflow.xsd" />  <Setting name="tasksNamesFile" value="C:\Wexflow-netcore\TasksNames.json" />  <Setting name="tasksSettingsFile" value="C:\Wexflow-netcore\TasksSettings.json" />  <Setting name="globalVariablesFile" value="C:\Wexflow-netcore\GlobalVariables.xml" />  <!-- SQLite или MongoDB или SQLServer или PostgreSQL или MySQL или LiteDB или Oracle -->  <Setting name="dbType" value="SQLite" />  <!-- SQLite -->  <Setting name="connectionString" value="Data Source=C:\Wexflow-netcore\Database\Wexflow.sqlite;Version=3;" />  <!-- MongoDB -->  <!--<Setting name="connectionString" value="Database=wexflow_netcore;MongoUrl=mongodb://localhost:27017;EnabledSslProtocols=false;SslProtocols=None" />-->  <!-- SQLServer -->  <!--<Setting name="connectionString" value="Server=localhost;Trusted_Connection=True;Database=wexflow_netcore;" />-->  <!-- PostgreSQL -->  <!--<Setting name="connectionString" value="Server=127.0.0.1;User Id=postgres;Password=pwd;Database=wexflow_netcore;Port=5432" />-->  <!-- MySQL -->  <!--<Setting name="connectionString" value="Server=localhost;Database=wexflow_netcore;Uid=root;Pwd=pwd;Port=3306" />-->  <!-- LiteDB -->  <!--<Setting name="connectionString" value="Filename=C:\Wexflow-netcore\Database\Wexflow.db; Connection=direct" />-->  <!-- Oracle -->  <!--<Setting name="connectionString" value="Data Source=localhost:1521/wexflownetcore;User Id=SYSTEM;Password=pwd;" />--></Wexflow>
Linux

Внизу приведен файл конфигурации Wexflow.xml для версии .NET Core:

<?xml version="1.0" encoding="UTF-8" ?><Wexflow>  <Setting name="workflowsFolder" value="/opt/wexflow/Wexflow/Workflows" />  <Setting name="recordsFolder" value="/opt/wexflow/Wexflow/Records" />  <Setting name="recordsHotFolder" value="/opt/wexflow/Wexflow/Records/_HotFolder" />  <Setting name="tempFolder" value="/opt/wexflow/Wexflow/Temp" />  <Setting name="tasksFolder" value="/opt/wexflow/Wexflow/Tasks" />  <Setting name="approvalFolder" value="/opt/wexflow/Wexflow/Approval" />  <Setting name="xsd" value="/opt/wexflow/Wexflow/Workflow.xsd" />  <Setting name="tasksNamesFile" value="/opt/wexflow/Wexflow/TasksNames.json" />  <Setting name="tasksSettingsFile" value="/opt/wexflow/Wexflow/TasksSettings.json" />  <Setting name="globalVariablesFile" value="/opt/wexflow/Wexflow/GlobalVariables.xml" />  <!-- SQLite или MongoDB или SQLServer или PostgreSQL или MySQL или LiteDB или Oracle -->  <Setting name="dbType" value="SQLite" />  <!-- SQLite -->  <Setting name="connectionString" value="Data Source=/opt/wexflow/Wexflow/Database/Wexflow.sqlite;Version=3;" />  <!-- MongoDB -->  <!--<Setting name="connectionString" value="Database=wexflow_netcore;MongoUrl=mongodb://localhost:27017;EnabledSslProtocols=false;SslProtocols=None" />-->  <!-- SQLServer -->  <!--<Setting name="connectionString" value="Server=localhost;Trusted_Connection=True;Database=wexflow_netcore;" />-->  <!-- PostgreSQL -->  <!--<Setting name="connectionString" value="Server=127.0.0.1;User Id=postgres;Password=pwd;Database=wexflow_netcore;Port=5432" />-->  <!-- MySQL -->  <!--<Setting name="connectionString" value="Server=localhost;Database=wexflow_netcore;Uid=root;Pwd=pwd;Port=3306" />-->  <!-- LiteDB -->  <!--<Setting name="connectionString" value="Filename=/opt/wexflow/Wexflow/Database/Wexflow.db; Connection=direct" />-->  <!-- Oracle -->  <!--<Setting name="connectionString" value="Data Source=localhost:1521/wexflownetcore;User Id=SYSTEM;Password=pwd;" />--></Wexflow>
macOS

Ниже приведен файл конфигурации Wexflow.xml для версии .NET Core:

<?xml version="1.0" encoding="UTF-8" ?><Wexflow>  <Setting name="workflowsFolder" value="/Applications/wexflow/Wexflow/Workflows" />  <Setting name="recordsFolder" value="/Applications/wexflow/Wexflow/Records" />  <Setting name="recordsHotFolder" value="/Applications/wexflow/Wexflow/Records/_HotFolder" />  <Setting name="tempFolder" value="/Applications/wexflow/Wexflow/Temp" />  <Setting name="tasksFolder" value="/Applications/wexflow/Wexflow/Tasks" />  <Setting name="approvalFolder" value="/Applications/wexflow/Wexflow/Approval" />  <Setting name="xsd" value="/Applications/wexflow/Wexflow/Workflow.xsd" />  <Setting name="tasksNamesFile" value="/Applications/wexflow/Wexflow/TasksNames.json" />  <Setting name="tasksSettingsFile" value="/Applications/wexflow/Wexflow/TasksSettings.json" />  <Setting name="globalVariablesFile" value="/Applications/wexflow/Wexflow/GlobalVariables.xml" />  <!-- SQLite или MongoDB или SQLServer или PostgreSQL или MySQL или LiteDB или Oracle -->  <Setting name="dbType" value="SQLite" />  <!-- SQLite -->  <Setting name="connectionString" value="Data Source=/Applications/wexflow/Wexflow/Database/Wexflow.sqlite;Version=3;" />  <!-- MongoDB -->  <!--<Setting name="connectionString" value="Database=wexflow_netcore;MongoUrl=mongodb://localhost:27017;EnabledSslProtocols=false;SslProtocols=None" />-->  <!-- SQLServer -->  <!--<Setting name="connectionString" value="Server=localhost;Trusted_Connection=True;Database=wexflow_netcore;" />-->  <!-- PostgreSQL -->  <!--<Setting name="connectionString" value="Server=127.0.0.1;User Id=postgres;Password=pwd;Database=wexflow_netcore;Port=5432" />-->  <!-- MySQL -->  <!--<Setting name="connectionString" value="Server=localhost;Database=wexflow_netcore;Uid=root;Pwd=pwd;Port=3306" />-->  <!-- LiteDB -->  <!--<Setting name="connectionString" value="Filename=/Applications/wexflow/Wexflow/Database/Wexflow.db; Connection=direct" />-->  <!-- Oracle -->  <!--<Setting name="connectionString" value="Data Source=localhost:1521/wexflownetcore;User Id=SYSTEM;Password=pwd;" />--></Wexflow>

Backend

Возможно форматирование даты и времени в backend с помощью опции настройки DateTimeFormat. Дата является локальной и может быть отформатирована по желанию конечного пользователя. Формат по умолчанию: dd-MM-yyyy HH:mm:ss.

Если данная опция настройки изменена, необходимо перезапустить сервер Wexflow, чтобы это учесть.

.NET

Чтобы изменить опцию настройки DateTimeFormat, просто откройте файл настроек C:\Program Files\Wexflow\Wexflow.Server.exe.config и отредактируйте соответствующую опцию.

.NET Core

Чтобы изменить опцию настройки DateTimeFormat, просто откройте файл настроек Wexflow.Server/appsettings.json и отредактируйте соответствующую опцию.

Провайдеры сохранения данных

Wexflow поддерживает 7 провайдеров сохранения данных. Вы можете выбрать из следующих опций:

  • SQLite (По умолчанию)
  • MongoDB
  • SQLServer
  • PostgreSQL
  • MySQL
  • LiteDB
  • Oracle

Если вы хотите изменить поставщика сохранения, вам необходимо обновить настройки dbType и connectionString в файле конфигурации Wexflow.xml.

Если вы хотите использовать SQL Server Trusted_Connection=true в строке подключения, вам нужно запустить службу Windows Wexflow от имени пользователя, у которого есть привилегии для подключения к SQL Server.

После изменения поставщика сохранения вы можете установить образцы рабочих процессов:

  • .NET: Пуск > Wexflow > Установить [dbType] Образцы
  • .NET Core Windows: ./install-[dbType].bat
  • .NET Core Linux: cd /opt/wexflow/Wexflow.Scripts.[dbType] && dotnet Wexflow.Scripts.[dbType].dll
  • .NET Core macOS: cd /Application/wexflow/Wexflow.Scripts.[dbType] && dotnet Wexflow.Scripts.[dbType].dll

Не забудьте проверить и обновить строку подключения в скрипте образцов при необходимости:

  • .NET: C:\Program Files\Wexflow\Wexflow.Scripts.[dbType]\Wexflow.Scripts.[dbType].exe.config
  • .NET Core Windows: ./Wexflow.Scripts.[dbType]/appsettings.json
  • .NET Core Linux: /opt/wexflow/Wexflow.Scripts.[dbType]/appsettings.json
  • .NET Core macOS: /Application/wexflow/Wexflow.Scripts.[dbType]/appsettings.json

Начало работы

.NET

После установки Wexflow, будут созданы папки C:\Wexflow\ и C:\WexflowTesting\.

Папка C:\Wexflow\ является основной папкой конфигурации Wexflow и содержит следующие элементы:

  • Wexflow.xml – основной файл конфигурации сервера Wexflow. Его путь можно настроить из C:\Program Files\Wexflow\Wexflow.Server.exe.config для версии .NET и из Wexflow.Server\appsettings.json для версии .NET Core.
  • Database/ – содержит базу данных движка рабочего процесса Wexflow.
  • Workflows/ – это горячая папка рабочего процесса, если включена горячая перезагрузка через EnableWorkflowsHotFolder.
  • Temp/ – временная папка Wexflow.
  • Tasks/ – это необязательная папка, которая может содержать DLL-файлы пользовательских задач.
  • Workflow.xsd – это XML-схема рабочего процесса.
  • GlobalVariables.xml – содержит глобальные переменные для рабочих процессов.
  • TasksNames.json – содержит названия задач. Этот файл конфигурации используется дизайнером.
  • TasksSettings.json – содержит настройки задач. Этот файл конфигурации используется дизайнером.

Папка C:\WexflowTesting\ содержит данные для тестовых сценариев.

Журналы записываются в C:\Program Files\Wexflow\Wexflow.log. На каждый день создается один файл журнала. Старые файлы журналов сохраняются в формате Wexflow.logyyyyMMdd.

.NET Core

В версии .NET Core:

  • Windows: Создаются папки C:\Wexflow-dotnet-core\ и C:\WexflowTesting\. Путь к основному файлу конфигурации C:\Wexflow-dotnet-core\Wexflow.xml можно настроить из Wexflow.Server\appsettings.json. Журналы записываются в Wexflow.Server\Wexflow.log.
  • Linux: Создаются папки /opt/wexflow/Wexflow/ и /opt/wexflow/WexflowTesting/. Путь к основному файлу конфигурации /opt/wexflow/Wexflow/Wexflow.xml можно настроить из /opt/wexflow/Wexflow.Server/appsettings.json. Журналы записываются в /opt/wexflow/Wexflow.Server/Wexflow.log.
  • macOS: Создаются папки /Applications/wexflow/Wexflow/ и /Applications/wexflow/WexflowTesting/. Путь к основному файлу конфигурации /Applications/wexflow/Wexflow/Wexflow.xml можно настроить из /Applications/wexflow/Wexflow.Server/appsettings.json. Журналы записываются в /Applications/wexflow/Wexflow.Server/Wexflow.log.

Дизайнер

Рабочие процессы можно создавать с помощью дизайнера пользовательского интерфейса, XML или JSON.

Рекомендуется ознакомиться с синтаксисом рабочих процессов (XML/JSON), чтобы ознакомиться с этим движком рабочих процессов.

Ниже приведен файл конфигурации рабочего процесса в формате XML:

<?xml version="1.0" encoding="utf-8" ?><!--    Это файл конфигурации рабочего процесса.     Рабочий процесс состоит из:      - Идентификатора, который является уникальным целым числом.      - Имени, которое является уникальной строкой.      - Описания, которое является строкой.      - Раздела "Настройки", который состоит из следующих элементов:        - Типа запуска, который может быть одним из следующих вариантов:          - запуск при старте: рабочий процесс запускается при запуске веб-движка Wexflow.          - триггер: рабочий процесс запускается вручную из Wexflow Manager.          - периодического: рабочий процесс запускается периодически.          - cron: рабочий процесс запускается в зависимости от выражения cron.        - Периода, который необходим для периодического типа запуска. Это           временной отрезок в формате dd.hh:mm:ss. Например, период          00.00:02:00 будет запускать рабочий процесс каждые 2 минуты.        - Выражения cron, которое необходимо для типа запуска cron.          Например, '0 0/2 * * * ?' будет запускать рабочий процесс каждые 2 минуты.        - Параметра enabled, которая позволяет включать или отключать рабочий процесс.          Допустимые значения: true или false.        - Параметра approval, который помечает текущий рабочий процесс как рабочий процесс для одобрения.          Допустимые значения: true или false. Рабочий процесс для одобрения должен содержать          хотя бы одну задачу для одобрения или более.        - Параметра enableParallelJobs, который указывает, выполняются ли задания           рабочего процесса параллельно.           В противном случае задания добавляются в очередь. По умолчанию true.        - Раздела "Локальные переменные", который содержит локальные переменные.      - Раздела "Задачи", который содержит задачи, которые будут выполняться        рабочим процессом одна за другой.        - Задача состоит из:          - Идентификатора, который является уникальным целым числом.          - Имени, которое является одним из описанных в документации задач вариантов.          - Описания, которое является строкой.          - Параметра enabled, который позволяет включать или отключать задачу. Допустимые             значения: true или false.          - Коллекции настроек.      - Раздела "Граф выполнения", который содержит граф выполнения рабочего процесса.--><Workflow xmlns="urn:wexflow-schema" id="$int" name="$string" description="$string">  <Settings>    <Setting name="launchType" value="startup|trigger|periodic|cron" />    <Setting name="period" value="dd.hh:mm:ss" />    <Setting name="cronExpression" value="$string" />    <Setting name="enabled" value="true|false" />    <Setting name="approval" value="true|false" />    <Setting name="enableParallelJobs" value="true|false" />  </Settings>  <LocalVariables>    <Variable name="$string" value="$string" />    <Variable name="$string" value="$string" />    <!-- Вы можете добавлять любое количество переменных. -->  </LocalVariables>  <Tasks>    <Task id="$int" name="$string" description="$string" enabled="true|false">      <Setting name="$string" value="$string" />      <Setting name="$string" value="$string" />      <!-- Вы можете добавлять любое количество настроек. -->    </Task>    <Task id="$int" name="$string" description="$string" enabled="true|false">      <Setting name="$string" value="$string" />      <Setting name="$string" value="$string" />    </Task>    <!-- Вы можете добавлять любое количество задач. -->  </Tasks>  <!-- Этот раздел является необязательным и описан в разделе с примерами. -->  <ExecutionGraph /></Workflow>

Для рабочих процессов cron читайте следующую документацию для получения более подробной информации.

Локальные переменные объясняются здесь.

Глобальные переменные описаны здесь.

Опция name задачи должна быть одним из имен, перечисленных в следующей документации. Вы можете найти документацию по каждой задаче в папке Documentation в Wexflow.

Граф выполнения объясняется в разделе примеров.

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

Если создается новый рабочий процесс или если существующий рабочий процесс удален или изменен, вам не нужно перезапускать службу Windows Wexflow, чтобы эти изменения вступили в силу. Движок Wexflow автоматически обнаружит изменения и перезагрузит, добавит или удалит рабочий процесс.

Чтобы отключить рабочий процесс, вы можете установить значение параметра enabled рабочего процесса в false.

Как задачи осуществляют обмен информацией друг с другом?

Состояние передается между задачами через настройки selectFiles и selectEntities.

Это работает следующим образом:

  1. Задача в рабочем процессе выполняет свою работу и создает файлы, которые хранятся в коллекции.
  2. Другая задача (должна быть в том же рабочем процессе) впоследствии может ссылаться на эти файлы с помощью свойства XML selectFiles, указывая ID задачи, создавшей необходимые файлы. Затем она может использовать эти файлы для выполнения своей собственной работы.

Более наглядно (из примеров):

<Workflow xmlns="urn:wexflow-schema" id="1" name="Workflow_Invoices"  description="Workflow_Invoices">    <Settings>        <Setting name="launchType" value="trigger" />        <Setting name="enabled" value="true" />    </Settings>    <Tasks>        <Task id="1" name="FilesLoader" description="Загрузка счетов" enabled="true">            <Setting name="folder" value="C:\WexflowTesting\Invoices\" />        </Task>        <!-- дополнительные задачи здесь -->        <Task id="6" name="FilesMover" description="Перемещение счетов" enabled="true">            <Setting name="selectFiles" value="1" />            <Setting name="destFolder" value="C:\WexflowTesting\Invoices_sent\" />        </Task>    </Tasks></Workflow>

Настройка selectEntities работает так же, как и selectFiles. Единственное отличие заключается в том, что selectEntities предназначен для задач, обрабатывающих пользовательские объекты из базы данных или веб-сервисов, например. Для более подробной информации ознакомьтесь с этой документацией о сущностях.

Менеджер Wexflow

При первом открытии менеджера Wexflow вы увидите окно входа.

Вот учетные данные для входа:

  • Имя пользователя: admin
  • Пароль: wexflow2018

Вы можете изменить пароль из административной части.

Менеджер Wexflow – это простое приложение, которое позволяет выполнять следующие функции:

  • Просмотр всех загруженных рабочим движком Wexflow рабочих процессов.
  • Просмотр состояния выбранного рабочего процесса (работает, приостановлен, ожидает одобрения или отключен).
  • Запуск рабочего процесса.
  • Остановка рабочего процесса.
  • Приостановка рабочего процесса.
  • Возобновление рабочего процесса.
  • Одобрение рабочего процесса, требующего одобрения.
  • Отклонение рабочего процесса, требующего одобрения.
  • Кнопка “Backend” открывает интерфейс администрирования, с помощью которого можно управлять рабочими процессами, создавать рабочие процессы, отслеживать рабочие процессы и получать статистику рабочих процессов в режиме реального времени.
  • Кнопка “Logs” позволяет просмотреть журналы за день.
  • Кнопка “Refresh” позволяет перезагрузить список рабочих процессов.
  • Кнопка “Restart server” позволяет перезапустить сервер Wexflow.
  • Кнопка “Search” позволяет искать рабочие процессы.
  • Меню “Help” открывает страницу справки.
  • Меню “About” показывает версию Wexflow и проверяет наличие новой версии.

Для того чтобы узнать, что происходит в Wexflow, откройте журнальный файл C:\Program Files\Wexflow\Wexflow.log в текстовом редакторе, таком как Notepad++. Notepad++ будет обновлять файл журнала по мере его заполнения.

Backend

Backend – это веб-сайт, который вы можете разместить на IIS, Apache, NGINX или любом другом веб-сервере. Backend также может работать локально.

Backend предоставляет статистику в режиме реального времени по рабочим процессам. Он позволит вам управлять, проектировать и отслеживать ваши рабочие процессы с легкостью и гибкостью. Вы можете использовать backend для доступа, настройки, управления, администрирования и разработки своих рабочих процессов с легкостью.

Вход

При первом открытии backend вы увидите окно входа.

Вот учетные данные для входа:

  • Имя пользователя: админ
  • Пароль: wexflow2018

После входа в систему вы можете изменить пароль на странице “Пользователи“.

Сброс пароля

Если пользователь забыл свой пароль, он может нажать на ссылку “Забыли пароль?“, чтобы сбросить его.

При нажатии пользователем кнопки “Отправить“, ему будет отправлено письмо с временным паролем, который он сможет изменить после входа в систему.

Чтобы позволить backend отправлять электронные письма, необходимо настроить конфигурацию SMPT в конфигурации.

Панель управления (Dashboard)

После входа в систему вы попадете на страницу панели управления. Wexflow предоставляет вам красивую панель управления, на которой вы можете просматривать статистику в режиме реального времени по вашим рабочим процессам. Фактически, на странице “Панель управления” вы будете видеть статистику в режиме реального времени по рабочим процессам и сможете отслеживать ваш сервер рабочих процессов с легкостью и детализацией. С помощью панели управления вы также можете фильтровать записи рабочих процессов по ключевому слову или по дате. Также вы можете сортировать записи рабочих процессов по дате, по имени и т.д.

Менеджер (Manager)

Страница “Менеджер” позволит вам управлять ваши рабочими процессами. На этой странице вы можете запустить рабочий процесс, приостановить работающий рабочий процесс, возобновить приостановленный рабочий процесс, остановить работающий рабочий процесс и искать рабочие процессы.

Дизайнер (Designer)

Страница “Дизайнер” позволит вам проектировать ваши рабочие процессы. На этой странице вы можете создать новый рабочий процесс, отредактировать существующий рабочий процесс или удалить рабочий процесс. Используя страницу “Дизайнер“, мы получаем хороший визуальный обзор графа зависимостей рабочего процесса. Каждый узел представляет собой задачу, которую необходимо выполнить.

Кроме того, страница “Дизайнер” позволяет редактировать файлы рабочего процесса через веб-редактор XML или JSON.

Нажмите Ctrl+S, чтобы сохранить ваш рабочий процесс.

Нажмите Ctrl+Alt+H в режиме XML или JSON для вызова клавиатурных сочетаний.

Утверждение (Approval)

Страница “Утверждение” позволит вам просмотреть все рабочие процессы, требующие утверждения, и утвердить или отклонить их.

История (History)

Страница “История” позволит вам отслеживать все ваши рабочие процессы и все, что происходит на сервере рабочих процессов. С помощью этой страницы вы получите обзор всех экземпляров рабочих процессов, выполненных на сервере рабочих процессов. Кроме того, вы можете фильтровать записи по ключевому слову или по дате. Вы также можете сортировать записи по дате, по имени и т.д.

Пользователи (Users)

Страница “Пользователи” позволяет создавать новых пользователей, изменять пароли и информацию о пользователях и удалять пользователей с ограниченным доступом.

Пользователь с ограниченными правами имеет доступ только к странице “Панель управления” и странице “История“.

Профили (Profiles)

Страница “Профили” позволяет назначать рабочие процессы пользователям. После назначения рабочего процесса пользователь может запускать его, изменять и удалять.

Приложение для Android

Приложение для Android позволяет вам делать следующие вещи:

  • Просматривать все загруженные рабочим процессом Wexflow
  • Просматривать статус выбранного рабочего процесса (запущен, приостановлен, ожидает утверждения или отключен)
  • Запускать рабочий процесс
  • Останавливать рабочий процесс
  • Приостанавливать рабочий процесс
  • Возобновлять рабочий процесс
  • Утверждать рабочий процесс
  • Отклонять рабочий процесс

При открытии приложения Android первое, что вам потребуется сделать – это настроить URL API Wexflow в настройках.

Затем вы увидите экран входа в систему.

Вот учетные данные для входа:

  • Имя пользователя: admin
  • Пароль: wexflow2018

Вы можете изменить пароль из административной панели.

Примеры

Бизнес-процессы могут быть разработаны с помощью конструктора, XML или JSON. Однако настоятельно рекомендуется ознакомиться с синтаксисом бизнес-процессов Wexflow, чтобы ознакомиться с этой системой управления бизнес-процессами.

Каждый бизнес-процесс в Wexflow имеет конфигурацию (XML/JSON). Каждая конфигурация содержит набор настроек и задач для выполнения в соответствии с определенным планом и конфигурацией.

Последовательные бизнес-процессы

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

Бизнес-процесс 1

Этот бизнес-процесс загружает счета на SFTP-сервер, затем ожидает два дня, а затем уведомляет клиентов.

<Workflow xmlns="urn:wexflow-schema" id="99"  name="Workflow_Invoices" description="Workflow_Invoices">    <Settings>        <Setting name="launchType" value="trigger" />        <Setting name="enabled" value="true" />    </Settings>    <Tasks>        <Task id="1" name="FilesLoader" description="Loading invioces" enabled="true">            <Setting name="folder" value="C:\WexflowTesting\Invoices\" />        </Task>        <Task id="2" name="Ftp" description="Uploading invoices" enabled="true">            <Setting name="protocol" value="sftp" /> <!-- ftp|ftps|sftp -->            <Setting name="command" value="upload" />             <!-- list|upload|download|delete -->            <Setting name="server" value="127.0.1" />            <Setting name="port" value="21" />            <Setting name="user" value="user" />            <Setting name="password" value="password" />            <Setting name="path" value="/" />            <Setting name="selectFiles" value="1" />        </Task>        <Task id="3" name="Wait" description="Waiting for 2 days" enabled="true">            <Setting name="duration" value="2.00:00:00" />        </Task>        <Task id="4" name="FilesLoader" description="Loading emails" enabled="true">            <Setting name="file" value="C:\WexflowTesting\Emails\Invoices.xml" />        </Task>       <Task id="5" name="MailsSender" description="Notifying customers" enabled="true">            <Setting name="selectFiles" value="4" />            <Setting name="host" value="127.0.0.1" />            <Setting name="port" value="587" />            <Setting name="enableSsl" value="true" />            <Setting name="user" value="user" />            <Setting name="password" value="password" />        </Task>        <Task id="6" name="FilesMover" description="Moving invoices" enabled="true">            <Setting name="selectFiles" value="1" />            <Setting name="destFolder" value="C:\WexflowTesting\Invoices_sent\" />        </Task>    </Tasks></Workflow>

Прежде всего, задача FilesLoader загружает все счета, находящиеся в папке C:\WexflowTesting\Invoices, затем задача Ftp загружает их на SFTP-сервер, затем задача Wait ожидает два дня, затем задача FilesLoader загружает электронные письма в формате XML, а затем задача MailsSender отправляет письма. Наконец, задача FilesMover перемещает счета в папку C:\WexflowTesting\Invoices_sent.

Рабочий процесс 2

Этот рабочий процесс ожидает появления файлов в C:\WexflowTesting\Watchfolder1\ и C:\WexflowTesting\Watchfolder2\, а затем загружает их на FTP-сервер, после чего перемещает их в папку C:\WexflowTesting\Sent\. Этот рабочий процесс запускается каждые две минуты.

<Workflow xmlns="urn:wexflow-schema" id="6" name="Workflow_FilesSender" description="Workflow_FilesSender">    <Settings>        <Setting name="launchType" value="periodic" />        <Setting name="period" value="00.00:02:00.00" />        <Setting name="enabled" value="true" />    </Settings>    <Tasks>        <Task id="1" name="FilesLoader" description="Загрузка файлов" enabled="true">            <Setting name="folder" value="C:\WexflowTesting\Watchfolder1\" />            <Setting name="folder" value="C:\WexflowTesting\Watchfolder2\" />        </Task>        <Task id="2" name="Ftp" description="Загрузка файлов на FTP-сервер" enabled="true">            <Setting name="protocol" value="ftp" /> <!-- ftp|ftps|sftp -->            <Setting name="command" value="upload" />             <!-- list|upload|download|delete -->            <Setting name="server" value="127.0.1" />            <Setting name="port" value="21" />            <Setting name="user" value="user" />            <Setting name="password" value="password" />            <Setting name="path" value="/" />            <Setting name="selectFiles" value="1" />        </Task>        <Task id="3" name="FilesMover"          description="Перемещение файлов в папку Sent" enabled="true">            <Setting name="selectFiles" value="1" />            <Setting name="destFolder" value="C:\WexflowTesting\Sent\" />        </Task>    </Tasks></Workflow>

Прежде всего, задача FilesLoader загружает все файлы, находящиеся в папках C:\WexflowTesting\Watchfolder1\ и C:\WexflowTesting\Watchfolder2\, затем задача Ftp загружает файлы и отправляет их на FTP-сервер. Наконец, задача FilesMover перемещает файлы в папку C:\WexflowTesting\Sent.

Если вы хотите запускать задачи при событиях с файлами, вы должны использовать задачу FileSystemWatcher, чтобы избежать появления большого количества журналов. Вот пример рабочего процесса.

Рабочий процесс 3

Этот рабочий процесс преобразует файлы WAV, находящиеся в папке C:\WexflowTesting\WAV\, в формат MP3 с помощью FFMPEG, а затем перемещает преобразованные файлы в папку C:\WexflowTesting\MP3.

<Workflow xmlns="urn:wexflow-schema" id="12" name="Workflow_ffmpeg"  description="Workflow_ffmpeg">    <Settings>        <Setting name="launchType" value="trigger" />        <Setting name="enabled" value="true" />    </Settings>    <Tasks>        <Task id="1" name="FilesLoader" description="Загрузка файлов WAV" enabled="true">            <Setting name="folder" value="C:\WexflowTesting\WAV\" />        </Task>        <Task id="2" name="ProcessLauncher" description="WAV в MP3" enabled="true">            <Setting name="selectFiles" value="1" />            <!-- Вам нужно установить FFMPEG -->            <Setting name="processPath"              value="C:\Program Files\ffmpeg\bin\ffmpeg.exe" />            <!-- переменные: {$filePath},{$fileName},{$fileNameWithoutExtension}-->            <Setting name="processCmd"              value="-i {$filePath} -codec:a libmp3lame -qscale:a 2              {$output:$fileNameWithoutExtension.mp3}" />             <Setting name="hideGui" value="true" />            <Setting name="generatesFiles" value="true" />         </Task>        <Task id="3" name="FilesMover"          description="Перемещение файлов MP3 из временной папки" enabled="true">            <Setting name="selectFiles" value="2" />            <Setting name="destFolder" value="C:\WexflowTesting\MP3\" />        </Task>    </Tasks></Workflow>

Прежде всего, задача FilesLoader загружает все файлы, находящиеся в папке C:\WexflowTesting\WAV\, затем задача ProcessLauncher запускает процесс FFMPEG на каждом файле, указывая правильную команду для создания файла MP3. Наконец, задача FilesMover перемещает файлы MP3 в папку C:\WexflowTesting\MP3.

Workflow 4

Этот рабочий процесс ожидает появления файлов WAV в папке C:\WexflowTesting\WAV\, затем перекодирует их в файлы MP3 с помощью VLC, затем загружает файлы MP3 на FTP-сервер, затем перемещает файлы WAV в папку C:\WexflowTesting\WAV_processed. Этот рабочий процесс запускается каждые 2 минуты.

<Workflow xmlns="urn:wexflow-schema" id="13" name="Workflow_vlc"  description="Workflow_vlc">    <Settings>        <Setting name="launchType" value="periodic" />        <Setting name="period" value="00.00:02:00.00" />        <Setting name="enabled" value="true" />    </Settings>    <Tasks>        <Task id="1" name="FilesLoader" description="Загрузка файлов WAV" enabled="true">            <Setting name="folder" value="C:\WexflowTesting\WAV\" />        </Task>        <Task id="2" name="ProcessLauncher" description="WAV в MP3" enabled="true">            <Setting name="selectFiles" value="1" />            <!-- Вам нужно установить VLC-->            <Setting name="processPath" value="C:\Program Files\VideoLAN\VLC\vlc.exe" />            <!-- переменные: {$filePath},{$fileName},{$fileNameWithoutExtension}-->            <Setting name="processCmd"              value="-I dummy {$filePath} :sout=#transcode{acodec=mpga}:std             {dst={$output:$fileNameWithoutExtension.mp3},access=file} vlc://quit" />            <Setting name="hideGui" value="true" />            <Setting name="generatesFiles" value="true" />        </Task>        <Task id="3" name="Ftp" description="Загрузка файлов MP3" enabled="true">            <Setting name="protocol" value="ftp" />            <Setting name="command" value="upload" />            <Setting name="server" value="127.0.1" />            <Setting name="port" value="21" />            <Setting name="user" value="user" />            <Setting name="password" value="password" />            <Setting name="path" value="/" />            <Setting name="selectFiles" value="2" />        </Task>        <Task id="4" name="FilesMover" description="Перемещение файлов WAV" enabled="true">            <Setting name="selectFiles" value="1" />            <Setting name="destFolder" value="C:\WexflowTesting\WAV_processed\" />        </Task>    </Tasks></Workflow>

Прежде всего, задача FilesLoader загружает все файлы, находящиеся в папке C:\WexflowTesting\WAV\, затем задача ProcessLauncher запускает процесс VLC для каждого файла, указывая правильную команду для создания файла MP3. Затем задача Ftp загружает файлы MP3, созданные задачей ProcessLauncher, и загружает их на FTP-сервер. Наконец, задача FilesMover перемещает обработанные файлы WAV в папку C:\WexflowTesting\WAV_processed.

Если вы хотите запускать задачи по событиям файловой системы, вам следует использовать задачу FileSystemWatcher, чтобы избежать излишнего количества журналов. Вот пример рабочего процесса.

Workflow 5

Этот рабочий процесс загружает определенные файлы с FTP-сервера. Процесс начинается с перечисления всех файлов, находящихся в корневой папке сервера, затем определенные файлы, которые будут загружены, помечаются с использованием XSLT (LisFiles.xslt), затем файлы загружаются через задачу Ftp с помощью тегов todo="toDownload" и from="app4", после чего загруженные файлы перемещаются в папку C:\WexflowTesting\Ftp_download.

<Workflow xmlns="urn:wexflow-schema" id="40"  name="Workflow_Ftp_download_tag" description="Workflow_Ftp_download_tag">    <Settings>        <Setting name="launchType" value="trigger" /> <!-- startup|trigger|periodic -->        <Setting name="enabled" value="true" /> <!-- true|false -->    </Settings>    <Tasks>        <Task id="1" name="Ftp" description="Listing files (FTP)" enabled="true">            <Setting name="command" value="list" />            <Setting name="protocol" value="ftp" /> <!-- ftp|ftps|sftp -->            <Setting name="server" value="127.0.1" />            <Setting name="port" value="21" />            <Setting name="user" value="user" />            <Setting name="password" value="password" />            <Setting name="path" value="/" />        </Task>        <Task id="2" name="ListFiles" description="Listing files" enabled="true">        </Task>        <Task id="3" name="Xslt"          description="Renaming and tagging files" enabled="true">            <Setting name="selectFiles" value="2" />            <Setting name="xsltPath" value="C:\Wexflow\Xslt\ListFiles.xslt" />            <Setting name="version" value="2.0" /> <!-- 1.0|2.0 -->            <Setting name="removeWexflowProcessingNodes" value="false" />        </Task>        <Task id="4" name="Ftp" description="Downloading files" enabled="true">            <Setting name="command" value="download" />            <Setting name="protocol" value="ftp" /> <!-- ftp|ftps|sftp -->            <Setting name="server" value="127.0.1" />            <Setting name="port" value="21" />            <Setting name="user" value="user" />            <Setting name="password" value="password" />            <Setting name="path" value="/" />            <Setting name="selectFiles" todo="toDownload" from="app4" />        </Task>        <Task id="5" name="FilesMover"          description="Moving files to Ftp_download" enabled="true">            <Setting name="selectFiles" value="4" />            <Setting name="destFolder" value="C:\WexflowTesting\Ftp_download\" />            <Setting name="overwrite" value="true" />        </Task>    </Tasks></Workflow>

Грубо говоря, задача Ftp загружает список файлов, находящийся в корневой папке FTP-сервера в текущем экземпляре рабочего процесса, затем задача ListFiles выводит файл XML, содержащий все загруженные файлы, затем задача Xslt на вход принимает этот XML и генерирует XML, который содержит системную ноду с именем WexflowProcessing, содержащую список файлов, которые должны быть помечены и/или переименованы.

Чтобы понять, как работает маркировка и переименование файлов, обратитесь к документации по задачам ListFiles и Xslt.

Ниже приведен XSLT ListFiles.xslt, использующийся для маркировки файлов:

<?xml version="1.0" encoding="utf-8"?><xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">  <xsl:output method="xml" indent="yes"/>  <xsl:template match="/">    <root>      <WexflowProcessing>        <xsl:for-each select="//wexflowProcessing/Workflow/Files//File">          <xsl:choose>            <xsl:when test="@name = 'file1.txt'">              <File taskId="{@taskId}" name="{@name}" renameTo="file1_renamed.txt"                     todo="toRename"                     from="app1" />            </xsl:when>            <xsl:when test="@name = 'file2.txt'">              <File taskId="{@taskId}" name="{@name}" renameTo="file2_renamed.txt"                     todo="toSend"                     from="app2" />            </xsl:when>            <xsl:when test="@name = 'file3.txt'">              <File taskId="{@taskId}" name="{@name}" renameTo="file3_renamed.txt"                     todo="toDownload"                     from="app3" />            </xsl:when>            <xsl:when test="@name = 'file4.txt'">              <File taskId="{@taskId}" name="{@name}" renameTo="file4_renamed.txt"                    todo="toDownload"                     from="app4" />            </xsl:when>          </xsl:choose>        </xsl:for-each>      </wexflowProcessing>    </root>  </xsl:template></xsl:stylesheet>

Execution Graph

This workflow loads the file C:\WexflowTesting\file1.txt, then uploads it to an FTP server, then moves it to C:\WexflowTesting\Sent\ folder.

<Workflow xmlns="urn:wexflow-schema" id="6"  name="Workflow_Ftp_upload" description="Workflow_Ftp_upload">    <Settings>        <Setting name="launchType" value="trigger" />        <Setting name="enabled" value="true" />    </Settings>    <Tasks>        <Task id="1" name="FilesLoader" description="Загрузка файлов" enabled="true">            <Setting name="file" value="C:\WexflowTesting\file1.txt" />        </Task>        <Task id="2" name="Ftp" description="Загрузка файлов на FTP" enabled="true">            <Setting name="protocol" value="ftp" />            <Setting name="command" value="upload" />            <Setting name="server" value="127.0.1" />            <Setting name="port" value="21" />            <Setting name="user" value="user" />            <Setting name="password" value="password" />            <Setting name="path" value="/" />            <Setting name="selectFiles" value="1" />        </Task>        <Task id="3" name="FilesMover"          description="Перемещение файлов в папку Sent" enabled="true">            <Setting name="selectFiles" value="1" />            <Setting name="destFolder" value="C:\WexflowTesting\Sent\" />        </Task>    </Tasks>    <ExecutionGraph>      <Task id="1"><Parent id="-1" /></Task>      <Task id="2"><Parent id="1"  /></Task>      <Task id="3"><Parent id="2"  /></Task>    </ExecutionGraph></Workflow>

Прежде всего, задача FilesLoader загружает файл C:\WexflowTesting\file1.txt, затем задача Ftp загружает этот файл и загружает его на FTP-сервер. Наконец, задача FilesMover перемещает этот файл в папку C:\WexflowTesting\Sent.

По соглашению, идентификатор родительской задачи первой выполняемой задачи должен быть всегда -1.

Однако, если граф выполнения изменен следующим образом:

<ExecutionGraph>  <Task id="1"><Parent id="-1" /></Task>  <Task id="3"><Parent id="1"  /></Task>  <Task id="2"><Parent id="3"  /></Task></ExecutionGraph>

Задача 3 будет выполняться после задачи 1.

Если граф выполнения изменен следующим образом:

<ExecutionGraph>  <Task id="3"><Parent id="-1" /></Task>  <Task id="2"><Parent id="3"  /></Task>  <Task id="1"><Parent id="2"  /></Task></ExecutionGraph>

Задача 3 будет выполняться первой, затем задача 2, а затем задача 1.

В графе выполнения запрещено две вещи:

  • Бесконечные циклы
  • Параллельные задачи

Вот пример бесконечных циклов:

<ExecutionGraph>  <Task id="1"><Parent id="-1" /></Task>  <Task id="2"><Parent id="1"  /></Task>  <Task id="1"><Parent id="2"  /></Task></ExecutionGraph>

Вот пример параллельных задач:

<ExecutionGraph>  <Task id="1"><Parent id="-1" /></Task>  <Task id="2"><Parent id="1"  /></Task>  <Task id="3"><Parent id="1"  /></Task></ExecutionGraph>

Диаграмма потоков

Диаграмма потоков представляет собой рабочий процесс, содержащий как минимум одну узловую диаграмму (If/While/Switch) в его графе выполнения. Узловая диаграмма получает на вход задачу узловой диаграммы и набор задач, выполняемых последовательно, одну за другой. Порядок выполнения задач может быть изменен, изменив граф выполнения узловой диаграммы.

If

Следующая рабочий процесс является диаграммой потоков, который активируется файлом file.trigger. Если на файловой системе найден файл file.trigger, то данный рабочий процесс загрузит файл file1.txt на FTP-сервер, а затем уведомит клиентов, что загрузка прошла успешно. В противном случае, если файл-триггер file.trigger не найден на файловой системе, рабочий процесс уведомит клиентов, что загрузка не удалась.

<Workflow xmlns="urn:wexflow-schema" id="7"  name="Workflow_If" description="Workflow_If">    <Settings>        <Setting name="launchType" value="trigger" />        <Setting name="enabled" value="true" />    </Settings>    <Tasks>        <Task id="1" name="FilesLoader" description="Loading files" enabled="true">            <Setting name="file" value="C:\WexflowTesting\file1.txt" />        </Task>        <Task id="2" name="Ftp" description="Uploading files" enabled="true">            <Setting name="protocol" value="ftp" />            <Setting name="command" value="upload" />            <Setting name="server" value="127.0.1" />            <Setting name="port" value="21" />            <Setting name="user" value="user" />            <Setting name="password" value="password" />            <Setting name="path" value="/" />            <Setting name="selectFiles" value="1" />        </Task>        <Task id="3" name="FilesLoader"          description="Loading emails (OK)" enabled="true">            <Setting name="file" value="C:\WexflowTesting\Emails\Emails.xml" />        </Task>       <Task id="4" name="MailsSender"         description="Notifying customers (OK)" enabled="true">            <Setting name="selectFiles" value="3" />            <Setting name="host" value="127.0.0.1" />            <Setting name="port" value="587" />            <Setting name="enableSsl" value="true" />            <Setting name="user" value="user" />            <Setting name="password" value="password" />        </Task>        <Task id="5" name="FilesLoader"          description="Loading emails (KO)" enabled="true">            <Setting name="file" value="C:\WexflowTesting\Emails\Emails.xml" />        </Task>       <Task id="6" name="MailsSender"         description="Notifying customers (KO)" enabled="true">            <Setting name="selectFiles" value="5" />            <Setting name="host" value="127.0.0.1" />            <Setting name="port" value="587" />            <Setting name="enableSsl" value="true" />            <Setting name="user" value="user" />            <Setting name="password" value="password" />        </Task>        <Task id="99" name="FileExists"          description="Checking trigger file" enabled="true">            <Setting name="file" value="C:\WexflowTesting\file.trigger" />        </Task>    </Tasks>    <ExecutionGraph>      <If id="100" parent="-1" if="99">         <Do>            <Task id="1"><Parent id="-1" /></Task>            <Task id="2"><Parent id="1"  /></Task>            <Task id="3"><Parent id="2"  /></Task>            <Task id="4"><Parent id="3"  /></Task>         </Do>         <Else>            <Task id="5"><Parent id="-1" /></Task>            <Task id="6"><Parent id="5"  /></Task>         </Else>      </If>    </ExecutionGraph></Workflow>

По общепринятому соглашению, идентификатор родительской задачи для первой задачи, выполняемой в узле, должен всегда быть -1.

Вы можете добавлять узлы схемы потока If практически в любое место в графе выполнения. Кроме того, вы можете добавлять их сколько угодно. Вы также можете добавлять их в узлы событий OnSuccess, OnWarning и OnError.

If может находиться внутри другого If, While или Switch.

While

Этот рабочий процесс запускается файлом file.trigger. Пока существует файл file.trigger, этот рабочий процесс будет загружать файл file1.txt на FTP-сервер, затем уведомлять клиентов, затем ожидать 2 дня, после чего начнет снова.

<Workflow xmlns="urn:wexflow-schema" id="8" name="Workflow_While"  description="Workflow_While">    <Settings>        <Setting name="launchType" value="trigger" />        <Setting name="enabled" value="true" />    </Settings>    <Tasks>        <Task id="1" name="FilesLoader" description="Загрузка файлов" enabled="true">            <Setting name="file" value="C:\WexflowTesting\file1.txt" />        </Task>        <Task id="2" name="Ftp" description="Загрузка файлов на FTP" enabled="true">            <Setting name="protocol" value="ftp" />            <Setting name="command" value="upload" />            <Setting name="server" value="127.0.1" />            <Setting name="port" value="21" />            <Setting name="user" value="user" />            <Setting name="password" value="password" />            <Setting name="path" value="/" />            <Setting name="selectFiles" value="1" />        </Task>        <Task id="3" name="FilesLoader" description="Загрузка электронных писем" enabled="true">            <Setting name="file" value="C:\WexflowTesting\Emails\Emails.xml" />        </Task>       <Task id="4" name="MailsSender"         description="Уведомление клиентов" enabled="true">            <Setting name="selectFiles" value="3" />            <Setting name="host" value="127.0.0.1" />            <Setting name="port" value="587" />            <Setting name="enableSsl" value="true" />            <Setting name="user" value="user" />            <Setting name="password" value="password" />        </Task>        <Task id="5" name="Wait" description="Ожидание 2 дней..." enabled="true">            <Setting name="duration" value="02.00:00:00" />        </Task>        <Task id="99" name="FileExists"          description="Проверка файлового триггера" enabled="true">            <Setting name="file" value="C:\WexflowTesting\file.trigger" />        </Task>    </Tasks>    <ExecutionGraph>      <While id="100" parent="-1" while="99">        <Task id="1"><Parent id="-1" /></Task>        <Task id="2"><Parent id="1"  /></Task>        <Task id="3"><Parent id="2"  /></Task>        <Task id="4"><Parent id="3"  /></Task>        <Task id="5"><Parent id="4"  /></Task>      </While>    </ExecutionGraph></Workflow>

По соглашению, идентификатор родительской задачи для первой задачи, которая будет выполнена в узле, должен всегда быть -1.

Вы можете добавлять узлы While практически где угодно в графе выполнения. Кроме того, вы можете добавлять их сколько угодно. Вы также можете добавлять их в узлы событий OnSuccess, OnWarning и OnError.

Узел While может находиться внутри узлов While, If и Switch.

Switch

Этот рабочий процесс запускается каждые 24 часа. В понедельник он загружает файлы на FTP-сервер, а в среду уведомляет клиентов.

<Workflow xmlns="urn:wexflow-schema" id="43" name="Workflow_Switch"  description="Workflow_Switch">  <Settings>    <Setting name="launchType" value="periodic" />	<Setting name="period" value="1.00:00:00" />    <Setting name="enabled" value="true" />  </Settings>  <Tasks>    <Task id="1" name="Now" description="Получение текущего дня" enabled="true">      <Setting name="culture" value="en-US" />        <Setting name="format" value="dddd" />    </Task>	<Task id="2" name="FilesLoader" description="Загрузка файлов" enabled="true">      <Setting name="file" value="C:\WexflowTesting\file1.txt" />    </Task>    <Task id="3" name="Ftp" description="Загрузка файлов" enabled="true">      <Setting name="protocol" value="ftp" />      <Setting name="command" value="upload" />      <Setting name="server" value="127.0.1" />      <Setting name="port" value="21" />      <Setting name="user" value="user" />      <Setting name="password" value="password" />      <Setting name="path" value="/" />      <Setting name="selectFiles" value="1" />    </Task>   <Task id="4" name="FilesLoader" description="Загрузка электронной почты" enabled="true">      <Setting name="file" value="C:\WexflowTesting\Emails\Emails.xml" />   </Task>   <Task id="5" name="MailsSender" description="Уведомление клиентов" enabled="true">        <Setting name="selectFiles" value="3" />        <Setting name="host" value="127.0.0.1" />        <Setting name="port" value="587" />        <Setting name="enableSsl" value="true" />        <Setting name="user" value="user" />        <Setting name="password" value="password" />    </Task>  </Tasks>  <ExecutionGraph>    <Switch id="100" parent="-1" switch="1">      <Case value="Понедельник">        <Task id="2"><Parent id="-1" /></Task>		<Task id="3"><Parent id="2" /></Task>      </Case>      <Case value="Среда">        <Task id="4"><Parent id="-1" /></Task>        <Task id="5"><Parent id="4" /></Task>      </Case>      <Default />    </Switch>  </ExecutionGraph></Workflow>

По соглашению, идентификатор родительской задачи для первой задачи, которая будет выполнена в узлах Case/Default, должен всегда быть -1.

Вы можете добавлять узлы Switch практически в любом месте графа выполнения. Кроме того, вы можете добавлять их сколько угодно. Вы также можете добавлять их в узлы событий OnSuccess, OnWarning и OnError.

Switch может находиться внутри While, If и Switch.

Схемы утверждения

Схемы утверждения – это схемы, помеченные как утверждение с помощью опции утверждение. Они могут быть помечены как утверждение как на странице дизайнера в бэкэнде, так и с помощью редактирования XML:

<Workflow xmlns="urn:wexflow-schema" id="125" name="Workflow_Approval"  description="Workflow_Approval">  <Settings>    <Setting name="launchType" value="trigger" />    <Setting name="enabled" value="true" />    <Setting name="approval" value="true" />  </Settings>  <LocalVariables />  <Tasks /></Workflow>

Схемы утверждения должны содержать как минимум одну задачу Утверждение. Задачи утверждения могут быть размещены где угодно в схеме и их может быть несколько. Вы можете создавать схемы, где некоторые задачи выполняются, затем схема ожидает утверждения, и затем пользователи, например, уведомляются.

Схемы утверждаются как с помощью Wexflow Manager, так и со страницы Утверждения в бэкэнде.

Если схема отклонена, возникает событие схемы OnRejected, и задачи после задачи утверждения не выполняются.

Отклонение схемы можно выполнить, щелкнув кнопку отклонить как со страницы Утверждения в бэкэнде, так и из Wexflow Manager.

Простая схема утверждения

Чтобы дать вам представление о том, как работают схемы утверждения, вот очень простой пример:

<Workflow xmlns="urn:wexflow-schema" id="131"  name="Workflow_Approval" description="Workflow_Approval">  <Settings>    <Setting name="launchType" value="trigger" />    <Setting name="enabled" value="true" />    <Setting name="approval" value="true" />  </Settings>  <LocalVariables />  <Tasks>    <Task id="1" name="Approval" description="Waiting for approval" enabled="true" />    <Task id="2" name="Wait" description="Waiting for 2 seconds" enabled="true">      <Setting name="duration" value="00.00:00:02" />    </Task>  </Tasks></Workflow>

Эта простая схема является схемой утверждения, которая ожидает утверждения, чтобы начать. После утверждения эта схема ждет 2 секунды. Эта схема может быть утверждена или отклонена как из Wexflow Manager, так и со страницы Утверждения в бэкэнде.

Событие схемы OnRejected

Вот еще одна простая схема утверждения:

<Workflow xmlns="urn:wexflow-schema" id="132"  name="Workflow_Approval_Disapprove" description="Workflow_Approval_Disapprove">  <Settings>    <Setting name="launchType" value="trigger" />    <Setting name="enabled" value="true" />    <Setting name="approval" value="true" />  </Settings>  <LocalVariables />  <Tasks>    <Task id="1" name="Approval" description="Waiting for approval" enabled="true" />    <Task id="2" name="Wait" description="Waiting for 2 seconds" enabled="true">      <Setting name="duration" value="00.00:00:02" />    </Task>    <Task id="3" name="Wait" description="Waiting for 3 seconds" enabled="true">      <Setting name="duration" value="00.00:00:03" />    </Task>  </Tasks>  <ExecutionGraph>	<Task id="1"><Parent id="-1" /></Task>	<Task id="2"><Parent id="1" /></Task>	<OnRejected>		<Task id="3"><Parent id="-1" /></Task>	</OnRejected>  </ExecutionGraph></Workflow>

Это простой рабочий процесс одобрения, который ожидает утверждения, чтобы начать. После утверждения этот рабочий процесс ожидает 2 секунды. Если этот рабочий процесс отклонен, задача 2 не выполняется, а выполняется задача 3. Другими словами, если этот рабочий процесс отклонен, он ожидает 3 секунды. Этот рабочий процесс может быть утвержден или отклонен как при помощи Wexflow Manager, так и со страницы утверждения в бэкэнде.

Рабочий процесс одобрения YouTube

Вот более профессиональный рабочий процесс одобрения:

<Workflow xmlns="urn:wexflow-schema" id="132"  name="Workflow_YouTube" description="Workflow_YouTube">  <Settings>    <Setting name="launchType" value="trigger" />    <Setting name="enabled" value="true" />    <Setting name="approval" value="true" />  </Settings>  <LocalVariables />  <Tasks>	<Task id="1" name="FilesLoader"      description="Загрузка видео на YouTube" enabled="true">		<Setting name="file" value="C:\WexflowTesting\YouTube\YouTube.xml" />	</Task>	<Task id="2" name="YouTube" description="Загрузка видео на YouTube" enabled="true">		<Setting name="selectFiles" value="1" />		<Setting name="user" value="username" />		<Setting name="applicationName" value="Wexflow" />		<Setting name="clientSecrets"          value="C:\Wexflow-dotnet-core\client_secrets.json" />	</Task>        <Task id="3" name="Approval"          description="Ожидание утверждения" enabled="true" />	<Task id="4" name="FilesLoader"      description="Загрузка уведомительных писем" enabled="true">		<Setting name="file" value="C:\WexflowTesting\Mails\mails.xml" />	</Task>	<Task id="5" name="MailsSender"      description="Отправка уведомительных писем" enabled="true">		<Setting name="selectFiles" value="4" />		<Setting name="host" value="smtp.gmail.com" />		<Setting name="port" value="587" />		<Setting name="enableSsl" value="true" />		<Setting name="user" value="user" />		<Setting name="password" value="password" />	</Task>	  </Tasks></Workflow>

Этот рабочий процесс начинается с загрузки видео на YouTube, затем он ожидает утверждения, чтобы проверить, что видео успешно загружены на YouTube и отредактированы командой управления. Затем, если этот рабочий процесс утвержден со страницы утверждения в бэкэнде или с помощью Wexflow Manager.

Когда этот рабочий процесс достигает задачи утверждения, он приостанавливает свои задания и ожидает процесс утверждения до его одобрения, а затем продолжает свои задачи.

Рабочий процесс одобрения подачи формы

Вот еще один интересный рабочий процесс одобрения:

<Workflow xmlns="urn:wexflow-schema" id="134"  name="Workflow_FormSubmission" description="Workflow_FormSubmission">	<Settings>		<Setting name="launchType" value="trigger" />		<Setting name="enabled" value="true" />		<Setting name="approval" value="true" />	</Settings>	<Tasks>		<Task id="1" name="ProcessLauncher"          description="Подача формы" enabled="true">			<Setting name="processPath"              value="C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" />			<Setting name="processCmd"              value="https://docs.google.com/forms/d/                    1sHnPCJ05GLecqvZb0MNeFkFK0eMuVqBUyWAo5uurEQ8/prefill" />			<Setting name="hideGui" value="false" /> 			<Setting name="generatesFiles" value="false" />		</Task>		<Task id="2" name="Approval" description="Ожидание утверждения" enabled="true" />		<Task id="3" name="Wait" description="Ожидание 2 секунды" enabled="true">			<Setting name="duration" value="00.00:00:02" />		</Task>		<Task id="4" name="Wait" description="Ожидание 3 секунды" enabled="true">		        <Setting name="duration" value="00.00:00:03" />		</Task>			</Tasks>	<ExecutionGraph>		<Task id="1"><Parent id="-1" /></Task>		<Task id="2"><Parent id="1" /></Task>		<!-- Вы можете добавить здесь другие задачи в зависимости от вашей потребности. -->		<Task id="3"><Parent id="2" /></Task>		<OnRejected>			<!-- Вы можете добавить здесь другие задачи в зависимости от вашей потребности. -->			<Task id="4"><Parent id="-1" /></Task>		</OnRejected>	</ExecutionGraph>	</Workflow>

Этот рабочий процесс утверждения открывает форму отправки и ожидает утверждения. Если отправка верна, то рабочий процесс утверждается и ожидает 2 секунды (это всего лишь простая задача для тестирования, но вы можете добавить задачи отправки по электронной почте или что угодно еще). В противном случае, если отправка неверна, рабочий процесс будет отклонен и будет ожидать 3 секунды (это всего лишь простая задача для тестирования, но вы можете добавить задачи отправки по электронной почте или что угодно еще). Этот рабочий процесс работает только в версии .NET Core Wexflow, потому что версия .NET Wexflow не поддерживает открытие GUI из задачи ProcessLauncher, так как сервер Wexflow работает в службе Windows в версии .NET.

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

Записи

Wexflow позволяет создавать рабочие процессы утверждения для общих активов, называемых записями. Запись – это сущность, которая относится к файлу. У каждой записи есть имя, описание, версии файла, комментарии, даты начала и окончания утверждения.

Менеджер может назначить запись пользователю. Если запись обновляется с необходимой информацией, менеджер может утвердить или отклонить рабочий процесс.

Вот простой рабочий процесс утверждения по записям:

<?xml version="1.0" encoding="utf-8"?><Workflow xmlns="urn:wexflow-schema" id="146"  name="Workflow_ApproveDocument" description="Workflow_ApproveDocument">  <Settings>    <Setting name="launchType" value="trigger" />    <Setting name="enabled" value="true" />    <Setting name="approval" value="true" />    <Setting name="enableParallelJobs" value="true" />  </Settings>  <LocalVariables />  <Tasks>    <Task id="1" name="ApproveRecord" description="Approve document" enabled="true">      <Setting name="record" value="1" />      <Setting name="assignedTo" value="wexflow" />    </Task>  </Tasks></Workflow>

Менеджер назначает запись 1 пользователю wexflow. Пользователь wexflow получит уведомление в Wexflow и электронное письмо, если настройки электронной почты правильно настроены для редактирования соответствующей записи. После обновления записи менеджер получит уведомление и сможет проверить последнюю версию записи. Если информация в записи верная, менеджер может утвердить рабочий процесс. В противном случае, он может его отклонить.

События рабочего процесса

После завершения работы рабочего процесса его конечный результат может быть успешным, или предупреждением, или ошибкой, или отклонением. Если конечный результат успешный, событие OnSuccess запускается. Если конечный результат предупреждение, событие OnWarning запускается. Если конечный результат ошибка, событие OnError запускается. Если рабочий процесс отклонен, событие OnRejected запускается. Событие содержит набор задач и/или узлов схемы выполнения для последовательного выполнения по одному. Порядок выполнения задач и/или узлов схемы выполнения может быть изменен путем изменения графа выполнения события.

Этот рабочий процесс загружает файл file1.txt на FTP-сервер, затем уведомляет клиентов в случае успеха.

<Workflow xmlns="urn:wexflow-schema" id="9"  name="Workflow_Events" description="Workflow_Events">    <Settings>        <Setting name="launchType" value="trigger" />        <Setting name="enabled" value="true" />    </Settings>    <Tasks>        <Task id="1" name="FilesLoader" description="Loading files" enabled="true">            <Setting name="file" value="C:\WexflowTesting\file1.txt" />        </Task>        <Task id="2" name="Ftp" description="Uploading files" enabled="true">            <Setting name="protocol" value="ftp" />            <Setting name="command" value="upload" />            <Setting name="server" value="127.0.1" />            <Setting name="port" value="21" />            <Setting name="user" value="user" />            <Setting name="password" value="password" />            <Setting name="path" value="/" />            <Setting name="selectFiles" value="1" />        </Task>       <Task id="3" name="FilesLoader" description="Loading emails" enabled="true">            <Setting name="file" value="C:\WexflowTesting\Emails\Emails.xml" />        </Task>       <Task id="4" name="MailsSender"         description="Notifying customers" enabled="true">            <Setting name="selectFiles" value="3" />            <Setting name="host" value="127.0.0.1" />            <Setting name="port" value="587" />            <Setting name="enableSsl" value="true" />            <Setting name="user" value="user" />            <Setting name="password" value="password" />        </Task>    </Tasks>    <ExecutionGraph>      <Task id="1"><Parent id="-1" /></Task>      <Task id="2"><Parent id="1"  /></Task>      <OnSuccess>        <Task id="3"><Parent id="-1" /></Task>        <Task id="4"><Parent id="3"  /></Task>      </OnSuccess>    </ExecutionGraph></Workflow>

Узлы событий в блок-схеме OnWarning, OnError и OnRejected могут использоваться одинаковым образом. Вы можете поместить узлы блок-схемы If и While в узлы событий.

Для события рабочего процесса OnRejected рабочий процесс должен быть рабочим процессом одобрения и должен содержать хотя бы одну задачу одобрения. Событие рабочего процесса OnRejected возникает после того, как конечный пользователь щелкнет кнопку отклонить на странице одобрения на бэкэнде или из Wexflow Manager.

Это простые и базовые рабочие процессы, чтобы дать представление о том, как создавать свои собственные рабочие процессы. Однако, если в рабочем процессе участвует несколько систем, приложений и автоматизаций, рабочий процесс может быть очень интересным.

Встроенные действия

Wexflow является модульным. Рабочий процесс выполняет набор задач. Пользователь может выбирать между встроенными задачами, поставляемыми с Wexflow, или создавать собственные пользовательские задачи.

Каждая задача является модулем, который можно включить, отключить или заменить. Wexflow предоставляет 100+ встроенных задач.

*: Задача недоступна в версии .NET Core.

**: Задача доступна только в версии .NET Core.

Задачи файловой системы

Эти задачи позволяют создавать, копировать, перемещать, переименовывать или удалять файлы и каталоги на файловой системе. Эти задачи также позволяют проверять, существует ли коллекция удаленных или локальных файлов и / или каталогов. Эти задачи также позволяют проверить, являются ли два файла одинаковыми, и также позволяют вычислить разницу между двумя файлами.

  • FilesLoader: Эта задача загружает коллекцию файлов, находящихся в папках или через опцию файла.
  • FilesLoaderEx: Эта задача загружает коллекцию файлов, находящихся в папках или через опцию файла. Эта задача наследуется от задачи FilesLoader, но по умолчанию результат пустой, вы должны настроить правила атрибутов файловой системы, чтобы заполнить результат.
  • FilesCopier: Эта задача копирует коллекцию файлов в папку назначения.
  • FilesMover: Эта задача перемещает коллекцию файлов в папку назначения.
  • FilesRemover: Эта задача удаляет коллекцию файлов.
  • FilesRenamer: Эта задача позволяет переименовывать коллекцию файлов на файловой системе. Задачу Xslt можно использовать вместе с задачей ListFiles для создания новых имен файлов.
  • FilesExist: Эта задача проверяет, существует ли коллекция файлов и / или каталогов.
  • FilesEqual: Эта задача проверяет, являются ли два файла одинаковыми.
  • FilesDiff*: Эта задача вычисляет разницу между двумя файлами.
  • FilesConcat: Эта задача объединяет коллекцию файлов.
  • FilesJoiner: Эта задача объединяет коллекцию файлов. Эту задачу следует использовать для объединения и восстановления исходного файла, разделенного задачей “FilesSplitter”. Исходное имя файла восстанавливается из имени разделенного файла с конечной частью “_N“.
  • FilesConcat: Эта задача разбивает файлы на части.
  • FilesInfo: Эта задача генерирует информацию о файлах для коллекции файлов и записывает результаты в XML-файл. Формат выходного XML-файла описан в документации к задаче.
  • Touch: Эта задача создает коллекцию пустых файлов.
  • ListFiles: Эта задача перечисляет все файлы, загруженные задачами рабочего процесса в журналах. Эта задача полезна для устранения проблем.
  • Mkdir: Эта задача создает коллекцию папок.
  • Rmdir: Эта задача удаляет коллекцию папок.
  • Movedir: Эта задача перемещает папку и позволяет перезаписать папку назначения.
  • FileSystemWatcher: Эта задача следит за горячей папкой и запускает задачи при создании, изменении или удалении файла.

Шифрование задачи

Эти задачи позволяют шифровать и расшифровывать файлы любого типа и любого размера. Эти задачи также позволяют шифровать и расшифровывать файлы на основе текста.

  • FilesEncryptor: Эта задача шифрует коллекцию файлов.
  • FilesEncryptor: Эта задача расшифровывает файлы, зашифрованные задачей FilesEncryptor.
  • TextsEncryptor: Эта задача шифрует коллекцию файлов на основе текста.
  • TextsDecryptor: Эта задача расшифровывает файлы, зашифрованные задачей TextsEncryptor.

Сжатие задачи

Эти задачи позволяют создавать .zip, .tar, .tar.gz или .7z из коллекции файлов. Эти задачи также позволяют извлекать архивы .zip, .tar, .tar.gz, .rar или .7z.

  • Zip: Эта задача создает zip-архив из коллекции файлов.
  • Tar: Эта задача создает tar-архив из коллекции файлов.
  • Tgz: Эта задача создает tar.gz-архив из коллекции файлов.
  • SevenZip*: Эта задача создает .7z-архив из коллекции файлов.
  • Unzip: Эта задача извлекает ZIP-архивы.
  • Untar: Эта задача извлекает TAR-архивы.
  • Untgz: Эта задача извлекает TAR.GZ-архивы.
  • Unrar*: Эта задача извлекает RAR-архивы.
  • UnSevenZip*: Эта задача извлекает 7Z-архивы.

Задачи создания Iso

Эти задачи позволяют создавать .iso из исходной папки и извлекать .iso в целевую папку.

  • IsoCreator*: Эта задача создает .iso из исходной папки.
  • IsoExtractor*: Эта задача извлекает .iso файлы.

Задачи голоса

Эти задачи позволяют преобразовывать текст в речь и речь в текст.

  • TextToSpeech*: Эта задача преобразовывает текстовые файлы в речь.
  • SpeechToText*: Эта задача преобразовывает аудиофайлы в текстовые файлы.

Задачи хеширования

Эти задачи позволяют генерировать MD5, SHA-1, SHA-256 и SHA-512 хеши коллекции файлов.

  • Md5: Эта задача генерирует MD5 суммы коллекции файлов и записывает результаты в XML-файл. Формат выходного XML-файла описан в документации к задаче.
  • Sha1: Эта задача генерирует SHA-1 хеши коллекции файлов и записывает результаты в XML-файл. Формат выходного XML-файла описан в документации к задаче.
  • Sha256: Эта задача генерирует SHA-256 хеши коллекции файлов и записывает результаты в XML-файл. Формат выходного XML-файла описан в документации к задаче.
  • Sha512: Эта задача генерирует SHA-512 хеши коллекции файлов и записывает результаты в XML-файл. Формат выходного XML-файла описан в документации к задаче.

Задачи обработки

Эти задачи позволяют запускать или прерывать процессы на сервере рабочего процесса. Они также позволяют получать информацию о процессе.

  • ProcessLauncher: Эта задача запускает процесс. Если процесс генерирует файл в качестве вывода, можно передать задаче коллекцию файлов, чтобы для каждого файла сгенерировался выходной файл через процесс. Для получения дополнительной информации ознакомьтесь с документацией по задаче.
  • ProcessKiller*: Эта задача прекращает работу процесса.
  • ProcessInfo: Эта задача показывает информацию о процессе.
  • SshCmd: Эта задача выполняет команду SSH.

Задачи сети

Эти задачи позволяют создавать, загружать, скачивать или удалять файлы по протоколам FTP, FTPS или SFTP. Они также позволяют скачивать файлы по протоколам HTTP или HTTPS. Они также позволяют скачивать торрент-файлы, пинговать серверы и выполнять запросы GET/POST/PUT/PATCH/DELETE.

  • Ftp: Эта задача позволяет создавать, загружать, скачивать или удалять файлы по протоколам FTP, FTPS или SFTP.
  • Http: Эта задача позволяет скачивать файлы по протоколам HTTP или HTTPS.
  • HttpGet: Эта задача выполняет запрос GET.
  • HttpPost: Эта задача выполняет запрос POST.
  • HttpPut: Эта задача выполняет запрос PUT.
  • HttpPatch: Эта задача выполняет запрос PATCH.
  • HttpDelete: Эта задача выполняет запрос DELETE.
  • Torrent: Эта задача скачивает торрент-файлы.
  • Ping: Эта задача на основе блок-схемы проверяет, отвечает ли сервер на запрос пинга или нет.

Задачи XML

Эти задачи позволяют работать с данными XML и CSV. Для генерации XML-документов можно использовать XSLT в сочетании с XPath. Поддерживаются XSLT 1.0 и XSLT 2.0.

  • CsvToXml: Эта задача преобразует CSV-файл в XML-файл.
  • XmlToCsv: Эта задача преобразует XML-файл в CSV-файл. Формат входного XML-файла описан в документации по задаче.
  • Xslt: Эта задача выполняет преобразование коллекции XML-файлов. Можно использовать процессор XSLT 1.0 или XSLT 2.0.
  • Guid: Эта задача генерирует GUID и выводит результат в XML-файл.

Задачи SQL

Эти задачи позволяют выполнять SQL-скрипты. Поддерживаются Microsoft SQL Server, Microsoft Access, Oracle, MySql, SQLite, PostGreSql и Teradata. Их можно использовать для пакетного вставки данных, для обновления базы данных, для очистки базы данных, для перестройки индексов, для оптимизации индексов, для уменьшения размера баз данных, для обновления статистики, для передачи данных базы данных и так далее. Они также позволяют экспортировать SQL-данные в XML или CSV и импортировать CSV-данные в базу данных. Также они позволяют создавать резервные копии и восстанавливать базы данных.

  • Sql: Это задача выполняет SQL-скрипты. Она поддерживает Microsoft SQL Server, Microsoft Access, Oracle, MySql, SQLite, PostGreSql и Teradata.
  • SqlToXml: Это задача выполняет SQL-скрипты и выводит результаты в XML-файлах. Она поддерживает Microsoft SQL Server, Microsoft Access, Oracle, MySql, SQLite, PostGreSql и Teradata.
  • SqlToCsv: Это задача выполняет SQL-скрипты и выводит результаты в CSV-файлах. Она поддерживает Microsoft SQL Server, Microsoft Access, Oracle, MySql, SQLite, PostGreSql и Teradata.
  • CsvToSql: Эта задача преобразует CSV-файлы в SQL-скрипты (только для вставки в SQL Server).

Задачи WMI

  • Wmi*: Эта задача выполняет запрос WMI и выводит результаты в XML-файле. Формат файла описан в документации задачи.

Задачи работы с изображениями

Эти задачи позволяют преобразовывать изображения в следующие форматы: Bmp, Emf, Exif, Gif, Icon, Jpeg, Png, Tiff и Wmf. Они также позволяют изменять размер, обрезать, объединять или наложить друг на друга изображения.

  • ImagesTransformer: Эта задача преобразует коллекцию файлов изображений в указанный формат. Выходной формат может быть одним из следующих: Bmp, Emf, Exif, Gif, Icon, Jpeg, Png, Tiff или Wmf.
  • ImagesResizer: Эта задача изменяет размер коллекции изображений.
  • ImagesCropper: Эта задача обрезает коллекцию изображений.
  • ImagesConcat: Эта задача объединяет коллекцию изображений.
  • ImagesOverlay: Эта задача наложения изображений друг на друга.

Задачи работы с аудио и видео

Эти задачи позволяют преобразовывать, резать или редактировать аудио и видео файлы с помощью FFMEG, VLC или другого аудио/видео программного обеспечения. Они также могут использоваться для выполнения пользовательских операций, таких как создание изображений и миниатюр из видео файлов. Они также позволяют генерировать самую важную техническую и теговую информацию для видео и аудио файлов.

  • MediaInfo*: Эта задача генерирует самую важную техническую и теговую информацию для видео и аудио файлов и выводит результаты в XML-файле. Формат файла описан в документации задачи.
  • YouTube**: Эта задача загружает видео на YouTube.
  • YouTubeSearch**: Эта задача осуществляет поиск контента на YouTube.
  • YouTubeListUploads**: Эта задача получает список видео, загруженных на канал YouTube.
  • Vimeo: Эта задача загружает видео на Vimeo.
  • VimeoListUploads: Эта задача получает список видео, загруженных на канал Vimeo.

Задача ProcessLauncher может быть использована с FFMEG, VLC или другим программным обеспечением для выполнения аудио и видео задач.

Задачи электронной почты

Эта задача позволяет отправлять или получать коллекцию электронных писем.

  • MailsSender: Эта задача отправляет коллекцию писем из XML файлов. Формат входных XML файлов описан в документации задачи.
  • MailsReceiver: Эта задача извлекает коллекцию писем.

Задачи рабочего процесса

  • Workflow*: Эта задача позволяет запускать, приостанавливать, возобновлять, останавливать, утверждать или не утверждать список рабочих процессов.
  • SubWorkflow: Эта задача запускает вложенный рабочий процесс.

Задачи социальных медиа

  • Twitter: Эта задача отправляет твиты.
  • InstagramUploadImage: Эта задача загружает изображения в Instagram.
  • InstagramUploadVideo: Эта задача загружает видео в Instagram.
  • Reddit**: Эта задача отправляет посты и ссылки на Reddit.
  • RedditListPosts**: Эта задача извлекает историю публикаций Reddit.
  • RedditListComments**: Эта задача извлекает историю комментариев Reddit.

Задачи ожидания

  • Wait: Эта задача ожидает указанное время.

Задачи отчетности

Эти задачи позволяют генерировать отчеты в формате PDF из HTML, XML или TXT файлов.

  • TextToPdf*: Эта задача создает PDF файлы из TEXT файлов.
  • HtmlToPdf*: Эта задача создает PDF файлы из HTML файлов.
  • PdfToText*: Эта задача извлекает TEXT из PDF файлов.

Задача Xslt может использоваться для создания HTML отчетов из XML файлов. Затем, HTML отчеты могут быть преобразованы в PDF отчеты с помощью задачи HtmlToPdf.

Веб-задачи

Эти задачи позволяют делать снимки экрана с веб-страниц и скачивать исходный код HTML с веб-страниц после их рендеринга. Эти задачи также позволяют сжимать JavaScript, CSS и HTML файлы. Эти задачи также позволяют извлекать текст из HTML файлов. Эти задачи также позволяют преобразовывать SCSS файлы в CSS файлы.

  • WebToScreenshot*: Эта задача делает снимки экрана с веб-страниц.
  • WebToHtml*: Эта задача извлекает исходный код HTML из веб-страниц.
  • UglifyJs*: Эта задача сжимает JavaScript файлы.
  • UglifyCss*: Эта задача сжимает и минимизирует CSS файлы.
  • UglifyHtml*: Эта задача сжимает и минимизирует HTML файлы.
  • HtmlToText*: Эта задача извлекает текст из HTML файлов.
  • ScssToCss**: Эта задача преобразовывает SCSS файлы в CSS файлы.

Скриптовые задачи

Эти задачи позволяют выполнять скрипты на C# и VB.

  • ExecCs*: Эта задача выполняет скрипты на C#.
  • ExecPython: Эта задача выполняет скрипты на Python.
  • ExecVb*: Эта задача выполняет скрипты на Visual Basic.

Задачи по работе с JSON и YAML

Эти задачи позволяют преобразовывать файлы YAML в файлы JSON, файлы JSON в файлы YAML, файлы CSV в файлы JSON и файлы CSV в файлы YAML.

  • YamlToJson*: Эта задача преобразует файлы YAML в файлы JSON.
  • JsonToYaml*: Эта задача преобразует файлы JSON в файлы YAML.
  • CsvToJson*: Эта задача преобразует файлы CSV в файлы JSON.
  • CsvToYaml*: Эта задача преобразует файлы CSV в файлы YAML.

Задачи по работе с объектами

  • ListEntities: Эта задача перечисляет все объекты, загруженные задачами рабочего процесса, в журналах. Эта задача полезна для устранения проблем.

Задачи для блок-схем

Эти задачи могут использоваться в рамках блок-схемных рабочих процессов для выполнения конкретных задач.

  • FileExists: Это блок-схемная задача, которая проверяет, существует ли указанный файл в файловой системе или нет.
  • FileMatch: Это блок-схемная задача, которая проверяет, существует ли файл или нет в каталоге с использованием регулярного выражения.
  • Now: Это блок-схемная задача, которая получает текущую дату в указанном формате. Эта задача предназначена для использования в узле Switch блок-схемы.
  • Ping: Это блок-схемная задача, которая проверяет, отвечает ли сервер на запрос пинга или нет.
  • EnvironmentVariable: Это блок-схемная задача, которая получает значение переменной среды.
  • MessageCorrect: Это блок-схемная задача, которая проверяет, находится ли сообщение в памяти задачи с использованием значения опции checkString.
  • FolderExists: Это блок-схемная задача, которая проверяет, существует ли указанный каталог в файловой системе или нет.
  • FileContentMatch: Эта задача проверяет, соответствует ли содержимое файла заданному регулярному выражению.

Задачи согласования

  • Approval: Эта задача помечает текущий рабочий процесс как требующий согласования.
  • ApproveRecord: Эта задача назначает запись пользователю и запускает процесс согласования для этой записи.
  • ApprovalRecordsCreator: Эта задача создает записи из файлов.
  • ApprovalWorkflowsCreator: Эта задача создает согласовательные рабочие процессы для записей из общей памяти и запускает их. Идентификаторы записей передаются из задачи ApprovalRecordsCreator.

Уведомления по задачам

  • Slack: Эта задача отправляет сообщения в Slack.

СМС задачи

  • Twilio: Эта задача отправляет СМС.

Локальные переменные

В рабочем процессе можно объявить локальные переменные.

Синтаксис следующий:

<Workflow xmlns="urn:wexflow-schema" id="115"  name="Workflow_FilesLoaderLocalVariables"  description="Workflow_FilesLoaderLocalVariables">	<Settings>		<Setting name="launchType" value="trigger" />		<Setting name="enabled" value="true" />	</Settings>	<LocalVariables>		<Variable name="myFile1" value="C:\WexflowTesting\file1.txt" />		<Variable name="myFile2" value="C:\WexflowTesting\file2.txt" />		<Variable name="myFile3" value="C:\WexflowTesting\file3.txt" /> 	</LocalVariables>	<Tasks>		<Task id="1" name="FilesLoader" description="Loading files" enabled="true">			<Setting name="file" value="$myFile1" />			<Setting name="file" value="$myFile2" />			<Setting name="file" value="$myFile3" />		</Task>		<Task id="2" name="ListFiles" description="Listing files" enabled="true">		</Task>	</Tasks></Workflow>

Когда сервер Wexflow загружает файл рабочего процесса, файл процесса будет проанализирован, и локальные переменные будут заменены их соответствующими значениями.

Также можно объединить глобальные переменные с локальными переменными, вот пример:

GlobalVariables.xml:

<?xml version="1.0" encoding="utf-8" ?><GlobalVariables>  <Variable name="wexflowTesting" value="C:\WexflowTesting" />  <Variable name="fileName1" value="file1.txt" />  <Variable name="fileName2" value="file2.txt" />  <Variable name="fileName3" value="file3.txt" /></GlobalVariables>

Ниже приведен образец рабочего процесса, содержащего глобальные переменные и локальные переменные:

<Workflow xmlns="urn:wexflow-schema" id="115"  name="Workflow_FilesLoaderLocalVariables"  description="Workflow_FilesLoaderLocalVariables">	<Settings>		<Setting name="launchType" value="trigger" />		<Setting name="enabled" value="true" />	</Settings>	<LocalVariables>		<Variable name="myFile1" value="$wexflowTesting\$fileName1" />		<Variable name="myFile2" value="$wexflowTesting\$fileName2" />		<Variable name="myFile3" value="$wexflowTesting\$fileName3" /> 	</LocalVariables>	<Tasks>		<Task id="1" name="FilesLoader" description="Loading files" enabled="true">			<Setting name="file" value="$myFile1" />			<Setting name="file" value="$myFile2" />			<Setting name="file" value="$myFile3" />		</Task>		<Task id="2" name="ListFiles" description="Listing files" enabled="true">		</Task>	</Tasks></Workflow>

Глобальные переменные

Глобальные переменные объявляются по умолчанию в файле C:\Wexflow\GlobalVariables.xml.

Путь к этому файлу может быть изменен из файла конфигурации C:\Wexflow\Wexflow.xml.

Вот пример GlobalVariables.xml:

<?xml version="1.0" encoding="utf-8" ?><GlobalVariables>  <Variable name="file1" value="C:\WexflowTesting\file1.txt" />  <Variable name="file2" value="C:\WexflowTesting\file2.txt" />  <Variable name="file3" value="C:\WexflowTesting\file3.txt" /></GlobalVariables>

Затем эти переменные можно использовать в файле рабочего процесса следующим образом:

<Workflow xmlns="urn:wexflow-schema" id="114"           name="Workflow_FilesLoaderGlobalVariables"           description="Workflow_FilesLoaderGlobalVariables">	<Settings>		<Setting name="launchType" value="trigger" /> 		<Setting name="enabled" value="true" />	</Settings>	<Tasks>		<Task id="1" name="FilesLoader" description="Loading files" enabled="true">			<Setting name="file" value="$file1" />			<Setting name="file" value="$file2" />			<Setting name="file" value="$file3" />		</Task>		<Task id="2" name="ListFiles" description="Listing files" enabled="true">		</Task>	</Tasks></Workflow>

Когда сервер Wexflow загружает файл рабочего процесса, этот файл разбирается так, что глобальные переменные заменяются своими значениями.

Планирование Cron

cron – это инструмент UNIX, существующий уже долгое время, поэтому его возможности планирования мощны и проверены практикой. Wexflow позволяет создавать рабочие процессы, которые запускаются в зависимости от cron-выражений.

Рабочие процессы по расписанию (cron) часто более полезны, чем рабочие процессы с триггером или периодические, если вам нужно, чтобы задание выполнялось в соответствии с календарем, а не в заданные интервалы.

С помощью рабочих процессов cron можно указать графики выполнения, такие как “каждую пятницу в полдень” или “каждый рабочий день в 9:30 утра”, или даже “каждые 5 минут с 9:00 до 10:00 утра по понедельникам, средам и пятницам”.

Cron-выражение представляет собой строку, состоящую из 6 или 7 полей, разделенных пробелами. Поля могут содержать любые допустимые значения, а также различные комбинации допустимых специальных символов для данного поля. Поля имеют следующий формат:

*    *    *    *    *    *     *  ┬    ┬    ┬    ┬    ┬    ┬     ┬│    │    │    │    │    │     └ Год (1970 - 2099) (Дополнительно) (Допустимые специальные символы: , - * /)│    │    │    │    │    └────── День недели (1 - 7) (Воскресенье=1) (Допустимые специальные символы: , - * ? / L #)│    │    │    │    └─────────── Месяц (1 - 12) (Янв=1) (Допустимые специальные символы: , - * /)│    │    │    └──────────────── День месяца (1 - 31) (Допустимые специальные символы: , - * ? / L W)│    │    └───────────────────── Часы (0 - 23) (Допустимые специальные символы: , - * /)│    └────────────────────────── Минуты (0 - 59) (Допустимые специальные символы: , - * /)└─────────────────────────────── Секунды (0 - 59) (Допустимые специальные символы: , - * /)

Таким образом, выражения cron могут быть такими простыми, как: * * * * ? *

или более сложными, например: 0/5 14,18,3-39,52 * ? JAN,MAR,SEP MON-FRI 2002-2010

Обратите внимание

Wexflow использует выражения cron с Quartz.NET. Выражения cron UNIX и выражения Quartz отличаются. Просто:

  • В Unix:
    (минуты, часы, дни, месяцы, дни_недели, годы)
  • В Quartz:
    (секунды, минуты, часы, дни, месяцы, дни_недели, годы)

Специальные символы

  • “” (“все значения”) – используется для выбора всех значений в поле. Например, “” в поле минут означает * “каждую минуту”.
  • ? (“нет конкретного значения”) – полезен, когда вам нужно указать что-то в одном из двух полей, в котором допустим символ, но не в другом. Например, если я хочу, чтобы мой рабочий процесс срабатывал в определенный день месяца (например, 10-е число), но не имею предпочтений, какой это будет день недели, я могу указать “10” в поле дня месяца и “?” в поле дня недели. Для уточнения смотрите примеры ниже.
  • используется для указания диапазона. Например, “10-12” в поле часов означает “часы 10, 11 и 12”.
  • , используется для указания дополнительных значений. Например, “ПН,СР,ПТ” в поле дней недели означает “понедельник, среда и пятница”.
  • / – используется для указания шагов. Например, “0/15” в поле секунд означает “секунды 0, 15, 30 и 45”. А “5/15” в поле секунд означает “секунды 5, 20, 35 и 50”. Вы также можете указать ‘/’ после символа ‘’ – в этом случае ‘’ эквивалентно ‘0’ перед ‘/’. ‘1/3’ в поле дня месяца означает “срабатывать каждые 3 дня, начиная с первого дня месяца”.
  • L (“последний”) – имеет различное значение в каждом из двух полей, в которых он разрешен. Например, значение “L” в поле дня месяца означает “последний день месяца” – 31-е число для января, 28-е число для февраля в невисокосные годы. Если использовать его в поле дня недели отдельно, он просто означает “7” или “СБ”. Но если использовать его в поле дня недели после другого значения, это означает “последний xxx день месяца” – например, “6L” означает “последняя пятница месяца”. Вы также можете указать смещение от последнего дня месяца, например, “L-3” означает третье с конца дня календарного месяца. При использовании опции ‘L’ важно не указывать списки или диапазоны значений, иначе вы получите запутанные/непредсказуемые результаты.
  • W (“рабочий день”) – используется для указания ближайшего рабочего дня (понедельник-пятница) к заданному дню. Например, если вы укажете “15W” в поле дня месяца, это означает: “ближайший рабочий день к 15-му числу месяца”. Так, если 15-е число выпадает на субботу, рабочий процесс будет срабатывать в пятницу, 14-го. Если 15-е число выпадает на воскресенье, рабочий процесс будет срабатывать в понедельник, 16-го. Если 15-е число выпадает на вторник, он сработает во вторник, 15-го. Однако, если вы указываете “1W” в качестве значения для дня месяца, и 1-е число выпадает на субботу, рабочий процесс будет срабатывать в понедельник, 3-го числа, так как он не “перепрыгнет” через границу дней месяца. Символ ‘W’ может быть указан только когда день месяца является одним числом, а не диапазоном или списком дней. ** Символы ‘L’ и ‘W’ также могут быть комбинированы в поле дня месяца для получения ‘LW’, что означает “последний рабочий день месяца”.
  • # используется для указания “n-го” XXX дня месяца. Например, значение “6#3” в поле дня недели означает “третью пятницу месяца” (день 6 = пятница и “#3” = третья в месяце). Другие примеры: “2#1” = первый понедельник месяца и “4#5” = пятая среда месяца. Обратите внимание, что если вы указываете “#5” и в месяце не будет 5-го заданного дня недели, то в этом месяце событие не сработает. ** Допустимые символы и названия месяцев и дней недели не чувствительны к регистру. MON эквивалентно mon.

Примеры

Вот некоторые примеры:

0 0 12 * * ?           Срабатывать в 12:00 каждый день.0 15 10 ? * *           Срабатывать в 10:15 каждый день.0 15 10 * * ?           Срабатывать в 10:15 каждый день.0 15 10 * * ? *         Срабатывать в 10:15 каждый день.0 15 10 * * ? 2019      Срабатывать в 10:15 каждый день в течение 2019 года.0 * 14 * * ?           Срабатывать каждую минуту, начиная с 14:00 и заканчивая 14:59, каждый день.0 0/5 14 * * ?          Срабатывать каждые 5 минут, начиная с 14:00 и заканчивая в 14:55,                          каждый день.0 0/5 14,18 * * ?       Срабатывать каждые 5 минут, начиная с 14:00 и заканчивая в 14:55,                          И срабатывать каждые 5 минут, начиная с 18:00 и заканчивая в 18:55,                          каждый день.0 0-5 14 * * ?          Срабатывать каждую минуту, начиная с 14:00 и заканчивая 14:05, каждый день.0 10,44 14 ? 3 WED      Срабатывать в 14:10 и в 14:44 каждую среду в марте.0 15 10 ? * MON-FRI     Срабатывать в 10:15 каждый понедельник, вторник, среду,                          четверг и пятницу.0 15 10 15 * ?          Срабатывать в 10:15 каждое 15-е число каждого месяца.0 15 10 L * ?          Срабатывать в 10:15 в последний день каждого месяца.0 15 10 L-2 * ?         Срабатывать в 10:15 в предпоследний день каждого месяца.0 15 10 ? * 6L          Срабатывать в 10:15 в последнюю пятницу каждого месяца.0 15 10 ? * 6L          Срабатывать в 10:15 в последнюю пятницу каждого месяца.0 15 10 ? * 6L 2019-2020 Срабатывать в 10:15 в каждую последнюю пятницу месяца                          в течение лет 2019 и 2020.0 15 10 ? * 6#3         Срабатывать в 10:15 в третью пятницу каждого месяца.0 0 12 1/5 * ?          Срабатывать в 12:00 каждые 5 дней каждого месяца,                          начиная с первого числа месяца.0 11 11 11 11 ?          Срабатывать каждое 11 ноября в 11:11.

Обратите внимание на эффекты символов ‘?’ и ‘*’ в полях дня недели и дня месяца!

Тип запуска по расписанию

Вы можете создавать этот тип рабочих процессов с помощью Wexflow Designer или редактировать XML. Однако, вот образец рабочего процесса, который запускается каждые две минуты:

<?xml version="1.0" encoding="utf-8"?><Workflow xmlns="urn:wexflow-schema" id="75" name="Workflow_Cron"  description="Workflow_Cron">  <Settings>    <Setting name="launchType" value="cron" />    <Setting name="cronExpression" value="0 0/2 * * * ?" /> <!-- Каждые две минуты -->    <Setting name="enabled" value="true" />  </Settings>  <Tasks>    <Task id="1" name="FilesLoader" description="Loading files" enabled="true">      <Setting name="file" value="C:\WexflowTesting\file1.txt" />    </Task>    <Task id="2" name="Wait" description="Wait for 10 seconds..." enabled="true">      <Setting name="duration" value="00.00:00:10" />    </Task>    <Task id="3" name="FilesCopier" description="Copying files" enabled="true">      <Setting name="selectFiles" value="1" />      <Setting name="destFolder" value="C:\WexflowTesting\Cron" />      <Setting name="overwrite" value="true" />    </Task>  </Tasks></Workflow>

Логирование

Все, что происходит в Wexflow, записывается и регистрируется. С помощью системы журналирования Wexflow, вы можете отслеживать ваши рабочие процессы легко и быть в курсе событий с мониторингом в реальном времени и уведомлениями по электронной почте.

Логи Wexflow записываются в C:\Program Files\Wexflow\Wexflow.log. На каждый день создается отдельный лог файл. Старые логи сохраняются в формате: Wexflow.logyyyyMMdd

Возможно настроить Wexflow для отправки отчетов о происшествиях при возникновении ошибки, используя log4net.Appender.SmtpAppender в конфигурационном файле Wexflow C:\Program Files\Wexflow\Wexflow.Clients.WindowsService.exe.config. Вот пример конфигурации:

<appender name="SmtpAppender" type="log4net.Appender.SmtpAppender">    <to value="[email protected]" />    <from value="[email protected]" />    <subject value="Some subject" />    <smtpHost value="smtp.gmail.com" />    <authentication value="Basic" />    <port value="587" />    <username value="gmail user name" />    <password value="gmail password" />    <bufferSize value="1" />    <EnableSsl value="true"/>    <lossy value="true" />    <evaluator type="log4net.Core.LevelEvaluator">        <threshold value="ERROR"/>    </evaluator>    <layout type="log4net.Layout.PatternLayout">        <conversionPattern value="%newline%date [%thread]          %-5level %logger [%property{NDC}] - %message%newline%newline%newline" />    </layout></appender>

Wexflow предоставляет вам красивую панель управления, чтобы просматривать статистику в реальном времени по вашим рабочим процессам. С помощью панели управления вы сможете легко отслеживать ваш сервер рабочих процессов.

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

Пользовательские задачи

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

Для создания настраиваемой задачи, например, MyTask, вам потребуется выполнить следующие действия:

  1. Создайте новый проект библиотеки классов в Visual Studio и назовите его Wexflow.Tasks.MyTask. Для .NET необходимо указать версию .NET 4.8. Для .NET Core необходимо указать версию .NET 6.
  2. Ссылайтесь на зависимости Wexflow через менеджер пакетов NuGet:
    PM> Install-Package Wexflow

    Или используйте .NET CLI (версию .NET Core):

    dotnet add package Wexflow
  3. Создайте public class MyTask, реализующий abstract класс Wexflow.Core.Task.

Код Wexflow.Tasks.MyTask должен выглядеть следующим образом:

using System.Threading;using System.Xml.Linq;using Wexflow.Core;namespace Wexflow.Tasks.MyTask{    public class MyTask : Task    {        public MyTask(XElement xe, Workflow wf) : base(xe, wf)        {            // Здесь размещаются настройки задачи        }        public override TaskStatus Run()        {            try            {                // Здесь размещается логика задачи                return new TaskStatus(Status.Success);            }            catch (ThreadAbortException)            {                throw;            }        }    }}

Каждая задача возвращает объект TaskStatus при завершении своей работы. TaskStatus состоит из следующих элементов:

public Status Status { get; set; }public bool Condition { get; set; }public string SwitchValue { get; set; }

Status может быть одним из следующих значений:

public enum Status{  Success,  Warning,  Error}

Например, если задача выполняет операцию над набором файлов и эта операция успешна для всех файлов, то ее Status должен быть Success. В противном случае, если операция успешна для некоторых файлов и не удалась для других, то ее Status должен быть Warning. В противном случае, если операция не удалась для всех файлов, то ее Status должен быть Error.

Свойство Condition предназначено для задач-схемы. Помимо статуса задачи, задача-схема возвращает либо true, либо false после выполнения своей операции.

Свойство Condition всегда должно быть установлено в false для последовательных задач.

SwitchValue предназначен для использования узлов Switch в схеме. Если вы устанавливаете значение в свойство SwitchValue и используете эту задачу в узле Switch схемы, будет выполнен соответствующий этому значению вариант. В противном случае, если задан вариант Default, то он будет выполнен.

Вы можете использовать соответствующий вам конструктор TaskStatus.

Для получения настроек вы можете использовать следующие методы:

string settingValue = this.GetSetting("settingName");string settingValue = this.GetSetting("settingName", defaultValue);string[] settingValues = this.GetSettings("settingName");

Чтобы загрузить файл внутри задачи, вы можете сделать следующее:

this.Files.Add(new FileInf(path, this.Id));

Чтобы загрузить сущность внутри задачи, вы можете сделать следующее:

this.Entities.Add(myEntity);

Наконец, если вы закончили программировать вашу настраиваемую задачу, скомпилируйте проект библиотеки классов и скопируйте сборку Wexflow.Tasks.MyTask.dll в C:\Program Files\Wexflow\ или в C:\Wexflow\Tasks. Путь к папке C:\Wexflow\Tasks\ может быть настроен через параметр tasksFolder в файле конфигурации C:\Wexflow\Wexflow.xml.

Ваша настраиваемая задача теперь готова к использованию следующим образом:

<Task id="$int" name="MyTask" description="My task description" enabled="true">    <Setting name="settingName" value="settingValue" /></Task>

Вот и все! Это все, что вам нужно знать, чтобы начать создавать свои собственные пользовательские задачи.

Чтобы протестировать пользовательскую задачу, создайте новый рабочий процесс (новый XML-файл) и поместите в него настройки пользовательской задачи следующим образом:

<Workflow xmlns="urn:wexflow-schema" id="99"           name="Workflow_MyWorkflow" description="Workflow_MyWorkflow">    <Settings>        <Setting name="launchType" value="trigger" />         <!-- startup|trigger|periodic|cron -->        <Setting name="enabled" value="true" /> <!-- true|false -->    </Settings>    <Tasks>        <Task id="1" name="MyTask" description="My task description" enabled="true">            <Setting name="settingName" value="settingValue" />        </Task>    </Tasks></Workflow>

Затем поместите этот XML-файл в C:\Wexflow\Workflows\.

Затем рабочий процесс появится в списке рабочих процессов в Менеджере Wexflow. Вы сможете запустить его оттуда.

.NET Core

Если вы используете .NET Core версию Wexflow, после создания пользовательской задачи Wexflow.Tasks.MyTask, поместите Wexflow.Tasks.MyTask.dll в:

  • Windows: C:\Wexflow-netcore\Tasks или .\Wexflow.Server
  • Linux: /opt/wexflow/Wexflow/Tasks или /opt/wexflow/Wexflow.Server
  • macOS: /Applications/wexflow/Wexflow/Tasks или /Applications/wexflow/Wexflow.Server

Ссылочные сборки

Если ваша пользовательская задача имеет ссылочные сборки, вам нужно скопировать их в C:\Program Files\Wexflow\, если вы используете версию .NET.

Если вы используете .NET Core версию, вам нужно скопировать их в:

  • Windows: C:\Wexflow-netcore\Tasks или .\Wexflow.Server
  • Linux: /opt/wexflow/Wexflow/Tasks или /opt/wexflow/Wexflow.Server
  • macOS: /Applications/wexflow/Wexflow/Tasks или /Applications/wexflow/Wexflow.Server

Логирование

В классе Task доступны следующие методы для логирования:

public void Info(string msg);public void InfoFormat(string msg, params object[] args);public void Debug(string msg);public void DebugFormat(string msg, params object[] args);public void Error(string msg);public void ErrorFormat(string msg, params object[] args);public void Error(string msg, Exception e);public void ErrorFormat(string msg, Exception e, params object[] args);

Файлы

Файлы могут быть загружены в задачу с помощью методов Add или AddRange:

this.Files.Add(myFile);this.Files.AddRange(myFiles);

Затем загруженные файлы можно выбрать в других задачах по их Id задачи следующим образом:

<Setting name="selectFiles" value="$taskId" />

Чтобы выбрать файлы, загруженные запущенным экземпляром рабочего процесса через настройку selectFiles, вы можете сделать это следующим образом:

FileInf[] files = this.SelectFiles();

Сущности

Сущность – это абстрактный класс, имеющий свойство Id задачи:

namespace Wexflow.Core{    public abstract class Entity    {        public int TaskId { get; set; }    }}

Класс сущности предназначен для наследования другими классами, такими как объекты, полученные из базы данных, веб-сервиса, API и т. д. Затем такие объекты могут быть загружены в задачу с помощью методов Add или AddRange:

this.Entities.Add(myEntity);this.Entities.AddRange(myEntities);

Затем можно выбирать загруженные сущности в других задачах по их Id следующим образом:

<Setting name="selectEntities" value="$taskId" />

Сущности предназначены для использования в пользовательских задачах.

Для выбора сущностей, загруженных экземпляром рабочего процесса с помощью параметра selectEntities, можно сделать следующее:

Entity[] entities = this.SelectEntities();

Класс Entity может быть очень полезен при работе с пользовательскими задачами, которые обрабатывают объекты из базы данных или веб-сервисов, например.

Общая память

Задачи содержат Hashtable, которую можно использовать как общую память между ними.

Чтобы добавить объект в Hashtable, просто выполните следующее:

this.Hashtable.Add("myKey", myObject);

Чтобы получить объект из Hashtable, просто выполните следующее:

var myObject = this.Hashtable["myKey"];

Чтобы удалить объект из Hashtable, просто выполните следующее:

this.Hashtable.Remove("myKey");

Дизайнер

Чтобы ваша пользовательская задача MyTask появилась в списке доступных задач в дизайнере, просто откройте файл C:\Wexflow\TasksNames.json и добавьте MyTask в него следующим образом:

[...{ "Name": "MyTask", "Description": "MyTask description."},]

Если вы используете .NET Core версию Wexflow, вам нужно отредактировать этот файл:

  • Windows: C:\Wexflow-netcore\TasksNames.json
  • Linux: /opt/wexflow/Wexflow/TasksNames.json
  • macOS: /Applications/wexflow/Wexflow/TasksNames.json

Вы также должны добавить настройки, открыв файл C:\Wexflow\TasksSettings.json и добавив ваши пользовательские настройки следующим образом:

{..."MyTask": [ {"Name": "settingName", "Required": true, "Type": "string", "List": [], "DefaultValue": ""} ],}

Если вы используете .NET Core версию Wexflow, вам нужно отредактировать этот файл:

  • Windows: C:\Wexflow-netcore\TasksSettings.json
  • Linux: /opt/wexflow/Wexflow/TasksSettings.json
  • macOS: /Applications/wexflow/Wexflow/TasksSettings.json

Доступные типы:

  • string
  • int
  • bool
  • password
  • list
  • user

Тип user относится к зарегистрированным пользователям в Wexflow.

Если вы выбираете тип list, вам нужно установить доступные варианты из списка. Вот пример:

{..."MyTask": [ {"Name": "protocol", "Required": true, "Type": "list", "List": ["ftp", "ftps", "sftp"], "DefaultValue": ""} ],}

Вот и всё. MyTask появится в дизайнере и при выборе будут отображаться его настройки.

Отладка

Чтобы отладить пользовательские задачи, вы можете использовать журналирование.

Вы также можете клонировать репозиторий Wexflow и открыть файл Wexflow.sln в Visual Studio и следовать этим инструкциям для запуска сервера Wexflow из кода. Затем вы можете создать свою пользовательскую задачу в решении и отладить ее. Чтобы отладить ее, выполните следующее:

  1. Создайте свою пользовательскую задачу.
  2. Укажите свою пользовательскую задачу в Wexflow.Server.
  3. Создайте рабочий процесс, используя свою пользовательскую задачу.
  4. Откройте Wexflow Manager или бэкэнд и запустите ваш рабочий процесс оттуда.

Командная строка

Wexflow предоставляет командную строку для запроса к серверу Wexflow. Инструмент командной строки доступен как для .NET, так и для .NET Core и работает на Windows, Linux и macOS.

Windows (.NET)

Инструмент командной строки находится в C:\Program Files\Wexflow\Wexflow.Clients.CommandLine. Чтобы запустить его, просто выполните исполняемый файл C:\Program Files\Wexflow\Wexflow.Clients.CommandLine\Wexflow.Clients.CommandLine.exe.

Файл конфигурации C:\Program Files\Wexflow\Wexflow.Clients.CommandLine\Wexflow.Clients.CommandLine.exe.config содержит настройки WexflowWebServiceUri, Username и Password.

Windows (.NET Core)

Инструмент командной строки находится в .\Wexflow.Clients.CommandLine. Чтобы запустить его, выполните следующую команду:

cd .\Wexflow.Clients.CommandLinedotnet Wexflow.Clients.CommandLine.dll

Файл конфигурации .\Wexflow.Clients.CommandLine\appsettings.json содержит настройки WexflowWebServiceUri, Username и Password.

Linux

После установки Wexflow на Linux, инструмент командной строки будет находиться в /opt/wexflow/Wexflow.Clients.CommandLine. Чтобы запустить его, выполните следующую команду:

cd /opt/wexflow/Wexflow.Clients.CommandLinedotnet Wexflow.Clients.CommandLine.dll

Файл конфигурации /opt/wexflow/Wexflow.Clients.CommandLine/appsettings.json содержит настройки WexflowWebServiceUri, Username и Password.

macOS

После установки Wexflow на macOS, инструмент командной строки будет находиться в /Applications/wexflow/Wexflow.Clients.CommandLine. Чтобы запустить его, выполните следующую команду:

cd /Applications/wexflow/Wexflow.Clients.CommandLinedotnet Wexflow.Clients.CommandLine.dll

Файл конфигурации /Applications/wexflow/Wexflow.Clients.CommandLine/appsettings.json содержит настройки WexflowWebServiceUri, Username и Password.

Опции

-o, --operation     Обязательно. start|suspend|resume|stop|approve|reject-i, --workflowId    Обязательно. Идентификатор рабочего процесса-j, --jobId         Идентификатор задачи (Guid)-w, --wait          (По умолчанию: false) Ожидать завершения рабочего процесса--help              Показать справочную информацию.--version           Показать информацию о версии.

Примеры

Запустить и ожидать

Следующая команда запускает рабочий процесс 41 и ожидает его завершения:

Wexflow.Clients.CommandLine.exe -o start -i 41 -w

Запустить и забыть

Следующая команда запускает рабочий процесс 41:

Wexflow.Clients.CommandLine.exe -o start -i 41

Остановить

Следующая команда останавливает рабочий процесс 41:

Wexflow.Clients.CommandLine.exe -o stop -i 41 -j 9144e328-dde3-468e-a8ba-913e3d5b7b92

Приостановить

Следующая команда приостанавливает рабочий процесс 41:

Wexflow.Clients.CommandLine.exe -o suspend -i 41 -j 9144e328-dde3-468e-a8ba-913e3d5b7b92

Возобновить

Следующая команда возобновляет рабочий процесс 41:

Wexflow.Clients.CommandLine.exe -o resume -i 41 -j 9144e328-dde3-468e-a8ba-913e3d5b7b92

Одобрить

Следующая команда одобряет рабочий процесс 126:

Wexflow.Clients.CommandLine.exe -o approve -i 126 -j 9144e328-dde3-468e-a8ba-913e3d5b7b92

Отклонить

Следующая команда отклоняет рабочий процесс 126:

Wexflow.Clients.CommandLine.exe -o reject -i 126 -j 9144e328-dde3-468e-a8ba-913e3d5b7b92

RESTful API

Wexflow Server – это автономное решение, которое может быть интегрировано в приложение, работающее на PHP, NodeJS, Ruby, Python и т. д., с помощью RESTful API.

Для всех методов API используется базовая аутентификация. Таким образом, заголовок авторизации должен быть установлен при каждом вызове API.

Пароли должны быть зашифрованы с использованием контрольных сумм MD5.

Вот пример заголовка авторизации для пользователя admin:

Authorization Basic YWRtaW46ZWUwNWVhYWJhN2I3NmYxNmUyODVkOTgzZDYwNWM5YmY=

который соответствует формату имя_пользователя:md5(пароль), закодированный в формате base64:

Basic base64(admin:ee05eaaba7b76f16e285d983d605c9bf)
Basic base64(admin:md5(wexflow2018))

Пароль пользователя admin по умолчанию – wexflow2018. Вы можете изменить его из интерфейса администратора.

Вы можете получить доступ к Swagger UI по адресу: http://localhost:8000

Панель управления

GET http://localhost:8000/api/v1/status-countВозвращает количество статусов.

GET http://localhost:8000/api/v1/entries-count-by-date?s={keyword}&from={date}&to={date}Возвращает количество записей по ключевому слову и диапазону дат.

GET http://localhost:8000/api/v1/search-entries-by-page-order-by?s={keyword}&from={date}&to={date}&page={page}&entriesCount={entriesCount}&heo={orderBy}Поиск записей.

GET http://localhost:8000/api/v1/entry-status-date-minВозвращает минимальную дату записи.

GET http://localhost:8000/api/v1/entry-status-date-maxВозвращает максимальную дату записи.

Менеджер

GET http://localhost:8000/api/v1/search?s={keyword}Поиск рабочих процессов.

GET http://localhost:8000/api/v1/search-approval-workflows?s={keyword}Поиск рабочих процессов одобрения.

GET http://localhost:8000/api/v1/workflow?w={id}Возвращает рабочий процесс по его идентификатору.

POST http://localhost:8000/api/v1/start?w={id}Запускает рабочий процесс.

POST http://localhost:8000/api/v1/start-with-variablesЗапускает рабочий процесс с переменными.

Вот пример полезной нагрузки:

{	"WorkflowId":131,	"Variables":[	  {		 "Name":"restVar1",		 "Value":"C:\\WexflowTesting\\file1.txt"	  },	  {		 "Name":"restVar2",		 "Value":"C:\\WexflowTesting\\file2.txt"	  }	]}

Вот пример рабочего процесса:

<Workflow xmlns="urn:wexflow-schema" id="138" name="Workflow_RestVariables" description="Workflow_RestVariables">  <Settings>    <Setting name="launchType" value="trigger" />    <Setting name="enabled" value="true" />  </Settings>  <LocalVariables></LocalVariables>  <Tasks>    <Task id="1" name="FilesLoader" description="Loading files" enabled="true">      <Setting name="file" value="$restVar1" />      <Setting name="file" value="$restVar2" />    </Task>    <Task id="2" name="ListFiles" description="Listing files" enabled="true"></Task>  </Tasks></Workflow>

POST http://localhost:8000/api/v1/stop?w={id}Останавливает рабочий процесс.

POST http://localhost:8000/api/v1/suspend?w={id}Приостанавливает рабочий процесс.

POST http://localhost:8000/api/v1/resume?w={id}Возобновляет рабочий процесс.

POST http://localhost:8000/api/v1/approve?w={id}Утверждает рабочий процесс.

POST http://localhost:8000/api/v1/disapprove?w={id}Отклоняет рабочий процесс.

Designer

GET http://localhost:8000/api/v1/tasks/{id}Возвращает задачи рабочего процесса.

GET http://localhost:8000/api/v1/xml/{id}Возвращает рабочий процесс в виде XML.

GET http://localhost:8000/api/v1/json/{id}Возвращает рабочий процесс в виде JSON.

GET http://localhost:8000/api/v1/task-namesВозвращает имена задач.

GET http://localhost:8000/api/v1/settings/{taskName}Возвращает настройки задачи.

POST http://localhost:8000/api/v1/task-to-xmlВозвращает задачу в виде XML.

GET http://localhost:8000/api/v1/is-workflow-id-valid/{id}Проверяет, действительный ли идентификатор рабочего процесса.

GET http://localhost:8000/api/v1/is-cron-expression-valid?e={cronExpression}Проверяет, действительное ли выражение Cron.

GET http://localhost:8000/api/v1/is-period-valid/{period}Проверяет, является ли период действительным.

POST http://localhost:8000/api/v1/is-xml-workflow-validПроверяет, является ли XML-документ рабочим процессом действительным.

POST http://localhost:8000/api/v1/save-xmlСохраняет рабочий процесс из XML-документа.

POST http://localhost:8000/api/v1/saveСохраняет рабочий процесс из JSON-документа.

POST http://localhost:8000/api/v1/delete?w={id}Удаляет рабочий процесс.

POST http://localhost:8000/api/v1/delete-workflowsУдаляет рабочие процессы.

GET http://localhost:8000/api/v1/graph/{id}Возвращает граф выполнения рабочего процесса.

История

GET http://localhost:8000/api/v1/history-entries-count-by-date?s={keyword}&from={date}&to={date}Возвращает количество записей в истории по ключевому слову и диапазону дат.

GET http://localhost:8000/api/v1/search-history-entries-by-page-order-by?s={keyword}&from={date}&to={date}&page={page}&entriesCount={entriesCount}&heo={orderBy}Ищет записи в истории.

GET http://localhost:8000/api/v1/history-entry-status-date-minВозвращает минимальную дату записи в истории.

GET http://localhost:8000/api/v1/history-entry-status-date-maxВозвращает максимальную дату записи в истории.

Пользователи

GET http://localhost:8000/api/v1/user?username={username}Возвращает пользователя по его имени пользователя.

GET http://localhost:8000/api/v1/search-users?keyword={keyword}&uo={orderBy}Ищет пользователей.

POST http://localhost:8000/api/v1/insert-user?username={username}&password={password}&up={userProfile}&email={email}Добавляет пользователя.

POST http://localhost:8000/api/v1/update-user?userId={userId}&username={username}&password={password}&up={userProfile}&email={email}Обновляет пользователя.

POST http://localhost:8000/api/v1/update-username-email-user-profile?userId={userId}&username={username}&password={password}&up={userProfile}&email={email}Обновляет имя пользователя, электронную почту и профиль пользователя.

POST http://localhost:8000/api/v1/delete-user?username={username}&password={password}Удаляет пользователя.

POST <


Leave a Reply

Your email address will not be published. Required fields are marked *