65.9K
CodeProject 正在变化。 阅读更多。
Home

Wexflow - 开源 .NET 工作流引擎

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.92/5 (39投票s)

2022 年 11 月 4 日

MIT

53分钟阅读

viewsIcon

176575

downloadIcon

1264

开源 .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 是一个开源、跨平台的 C# 工作流引擎和自动化平台,旨在自动化重复性任务。借助 Wexflow,构建自动化和工作流流程变得非常容易。

Wexflow 提供了一个跨平台的工作流服务器,一个用于设计、管理和跟踪工作流、顺序工作流、流程图工作流以及在称为记录的通用业务对象上进行审批工作流的后端。

Wexflow 提供 100 多个活动,可用于各种任务,并通过自定义活动和 Wexflow API 支持与其他解决方案进行自定义集成。

特点

Wexflow 提供以下功能

  • 跨平台工作流服务器
  • 强大的后端
  • HTML5 设计器
  • 原生 Android 应用
  • 顺序工作流
  • 流程图工作流
  • 审批工作流
  • 支持 6+ 种数据库
  • 100+ 活动
  • Cron 调度
  • 详细日志记录
  • 实时统计
  • 多语言支持
  • RESTful API
  • 可扩展

仪表板让您可以全面了解 Wexflow 中的实时统计信息

HTML5 设计器让您可以轻松创建工作流。只需将任务一个接一个地拖放即可

管理器可让您查看和管理正在运行的工作流实例

日志让您可以全面了解 Wexflow 中发生的情况。

Android 应用可让您查看和管理您的工作流

安装

Wexflow 易于安装,无需任何配置。它可以在几秒钟内完成安装和配置。

本节介绍如何在 Windows 上安装 .NET 版本,以及如何在 Windows、Linux 或 macOS 上安装 .NET Core 版本。

Windows (.NET)

  1. 安装 .NET Framework 4.8
  2. 下载 Wexflow 的最新版本。
  3. 右键单击安装程序,单击“属性”,选中“解除阻止”,然后单击“确定”。
  4. 启动安装程序并按照说明进行操作。

安装 Wexflow 后,将安装名为 Wexflow 的 Windows 服务并自动启动。

开始菜单中将添加以下菜单

  • 后端”菜单将打开后端。
  • 配置”菜单将打开 Wexflow 的配置文件夹。
  • 文档”菜单将打开 Wexflow 的文档文件夹。
  • 日志”菜单将打开当天的日志文件。
  • 管理器”菜单将打开 Wexflow Manager GUI。
  • 安装 SQLite 示例”菜单将安装 SQLite 工作流示例。
  • 安装 MongoDB 示例”菜单将安装 MongoDB 工作流示例。
  • 安装 SQL Server 示例”菜单将安装 SQL Server 工作流示例。
  • 安装 PostgreSQL 示例”菜单将安装 PostgreSQL 工作流示例。
  • 安装 MySQL 示例”菜单将安装 MySQL 工作流示例。
  • 安装 LiteDB 示例”菜单将安装 LiteDB 工作流示例。
  • 安装 Oracle 示例”菜单将安装 Oracle 工作流示例。

以下是从后端或 Wexflow Manager 登录的凭据

  • 用户名: admin
  • 密码: wexflow2018

登录后,您可以从后端更改密码。

如果您愿意,可以将在 Web 服务器上托管后端。

您可以从 7 种持久化提供程序中选择

  • SQLite (默认)
  • MongoDB
  • SQLServer
  • PostgreSQL
  • MySQL
  • LiteDB
  • Oracle

要了解如何更改持久化提供程序,请参阅 配置页面

要在 Web 服务器上安装后端,只需将文件夹 C:\Program Files\Wexflow\Backend\ 的内容复制到 Web 服务器。如果您想在另一台机器上安装后端,只需编辑配置文件 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 中,输入安装了 Wexflow 服务器的机器的 IP 或 DNS。请检查防火墙是否已打开 8000 端口。如果 Wexflow 运行在不同于 8000 的端口上,您也可以更改 port

Windows (.NET Core)

  1. 下载并安装 ASP.NET Core 8.0 运行时
  2. 下载并解压 Wexflow 的 .NET Core 程序包
  3. 双击“install.bat”以安装 Wexflow 的配置文件

完成。双击“run.bat”以启动 Wexflow 工作流服务器

要打开后端,请转到“Backend”文件夹并双击“index.html”文件。

凭据与 Windows .NET 部分列出的相同。

如果您愿意,可以将后端 /opt/wexflow/Backend/ 托管在 Web 服务器上。

Linux (.NET Core)

  1. 下载并安装 ASP.NET Core 8.0 运行时
  2. Wexflow 的 .NET Core 程序包 下载并解压到 /opt/
  3. 添加权限
sudo chown -R $USER:$USER /opt/wexflow
sudo chmod +x /opt/wexflow/install.sh
  1. 安装 wexflow systemd 服务
sudo /opt/wexflow/install.sh

完成。Wexflow 已安装。Swagger 可从以下地址访问:http://<hostname>:8000

现在,我们将后端安装在 NGINX 上。

首先,安装 NGINX

sudo apt update
sudo 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 / {
        # First attempt to serve request as file, then as directory,
        # then as index.html, then fall back to displaying a 404.
        try_files $uri $uri/ /index.html =404;
    }
}

检查 NGINX 配置,如果成功,则重新启动 NGINX

sudo nginx -t
sudo 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 中,输入安装了 Wexflow 服务器的机器的 IP 或 DNS。请检查防火墙是否已打开 8000 端口。如果 Wexflow 运行在不同于 8000 的端口上,您也可以更改 port

如果您想使用 MongoDB 持久化提供程序,则必须像这样更新 /opt/wexflow/wexflow.service

[Unit]
Description=wexflow
Wants=mongod.service
After=mongod.service

[Service]
ExecStart=/usr/bin/dotnet Wexflow.Server.dll
WorkingDirectory=/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. Wexflow 的 .NET Core 程序包 下载并解压到 /opt/
  4. 复制您保存在 /opt/wexflow 中的 Wexflow 文件夹
  5. 添加权限
sudo chown -R $USER:$USER /opt/wexflow
sudo chmod +x /opt/wexflow/install.sh
  1. 更新并重新启动 wexflow systemd 服务
sudo /opt/wexflow/install.sh

完成。Wexflow 已更新。

macOS (.NET Core)

  1. 下载并安装 ASP.NET Core 8.0 运行时
  2. Wexflow 的 .NET Core 程序包 下载并解压到 /Applications/

完成。您可以按以下方式运行 Wexflow

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

您可以通过在浏览器中打开 /Applications/wexflow/Backend/index.html 来打开后端。

凭据与 Windows .NET 部分列出的相同。

Docker

本节介绍了如何构建和运行 Wexflow Docker 映像。

unzip wexflow-linux-netcore.zip

./wexflow/ 文件夹将在您当前的文件夹中创建。

|-- ./
|-- ./wexflow/
|-- ./Dockerfile
|-- ./docker-compose.yml
  • 在您当前的文件夹中运行以下命令
docker compose up

./wexflow/ 文件夹将在运行时被挂载,这样您就可以访问 ./wexflow/Wexflow 配置文件夹,并在运行时添加自定义任务及其引用,访问日志文件并根据需要更改配置。

完成 Wexflow 将启动,后端可从以下地址访问:https://:8011/

如果您已经部署了 Wexflow 映像并想升级到另一个版本,请运行以下命令以确保所有功能都已更新

docker compose build --no-cache
docker compose up

如果您想使用 MongoDB 而不是 SQLite,请遵循 docker-compose.yml 文件中的说明。

配置

Wexflow 无需配置。但是,如果您想更改配置,可以阅读本节。

Wexflow 服务器

.NET

您可以从 C:\Program Files\Wexflow\Wexflow.Server.exe.config 配置 Wexflow 服务器

<?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/appsettings.json 配置 Wexflow 服务器

{
  "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", /* Date and time format in the backend. */
  "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 服务器的主配置文件。其路径可以从 .NET 版本的 C:\Program Files\Wexflow\Wexflow.Server.exe.config 和 .NET Core 版本的 Wexflow.Server\appsettings.json 进行配置。

.NET

以下是 .NET 版本的 Wexflow.xml 配置文件

<?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 or MongoDB or SQLServer or PostgreSQL or MySQL or LiteDB or 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://: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

以下是 .NET Core 版本的 Wexflow.xml 配置文件

<?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 or MongoDB or SQLServer or PostgreSQL or MySQL or LiteDB or 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://: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

以下是 .NET Core 版本的 Wexflow.xml 配置文件

<?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 or MongoDB or SQLServer or PostgreSQL or MySQL or LiteDB or 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://: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

以下是 .NET Core 版本的 Wexflow.xml 配置文件

<?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 or MongoDB or SQLServer or PostgreSQL or MySQL or LiteDB or 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://: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>

后端

可以通过 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

如果您想更改持久化提供程序,则需要更新 Wexflow.xml 配置文件中的 dbTypeconnectionString 设置。

如果您想使用 SQL Server,请在连接字符串中使用 Trusted_Connection=true,您必须以有权连接到 SQL Server 的用户身份运行 Wexflow Windows 服务。

更改持久化提供程序后,您可以安装工作流示例

  • .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 服务器的主配置文件。其路径可以从 .NET 版本的 C:\Program Files\Wexflow\Wexflow.Server.exe.config 和 .NET Core 版本的 Wexflow.Server\appsettings.json 进行配置。
  • Database/,其中包含 Wexflow 工作流引擎的数据库。
  • Workflows/,这是工作流的热文件夹,如果通过 EnableWorkflowsHotFolder 设置启用了热加载。
  • Temp/,这是 Wexflow 的临时文件夹。
  • Tasks/,这是一个可选文件夹,可以包含 自定义任务 的 DLL。
  • Workflow.xsd,这是工作流的 XML Schema 定义。
  • 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

设计器

工作流可以通过 UI 设计器、XML 或 JSON 进行设计。

建议了解工作流语法(XML/JSON),以便熟悉此工作流引擎。

以下是 XML 中工作流的配置文件

<?xml version="1.0" encoding="utf-8" ?>
<!--
    This is the configuration file of a workflow. 
    A workflow is composed of:
      - An id which is an integer that must be unique.
      - A name which is a string that must be unique.
      - A description which is a string.
      - A Settings section which is composed of the following elements:
        - A launchType which is one of the following options:
          - startup: The workflow is launched when Wexflow Engine starts.
          - trigger: The workflow is launched manually from Wexflow Manager.
          - periodic: The workflow is launched periodically.
          - cron: The workflow is launched depending on a cron expression.
        - A period which is necessary for the periodic launchType. It is 
          a timeSpan in this format dd.hh:mm:ss. For example the period
          00.00:02:00 will launch the workflow every 2 minutes.
        - A cron expression which is necessary for the cron launchType.
          For example '0 0/2 * * * ?' will launch the workflow every 2 minutes.
        - The enabled option which allows to enable or disable a workflow.
          The possible values are true or false.
        - The approval option which marks the current workflow as an approval workflow.
          The possible values are true or false. An approval workflow must contain
          at least one Approval task or more.
        - The enableParallelJobs option Shows whether workflow jobs are executed in parallel. 
          Otherwise jobs are queued. Defaults to true.
        - The retryCount option allows to retry a task a certain number of times in case of
          failure. Defaults to 0 (no retry).
        - The retryTimeout option indicates the waiting time between two tries in milliseconds.
          Defaults to 1500.
      - A LocalVariables section which contains local variables.
      - A Tasks section which contains the tasks that will be executed by
        the workflow one after the other.
        - A Task is composed of:
          - An id which is an integer that must be unique.
          - A name which is one of the options described in the tasks documentation.
          - A description which is a string.
          - The enabled option which allows to enable or disable a task. The possible 
            values are true or false.
          - A collection of settings.
      - An ExecutionGraph section which contains the execution graph of the workflow.
-->
<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" />
    <Setting name="retryCount" value="0" />
    <Setting name="retryTimeout" value="1500" />
  </Settings>
  <LocalVariables>
    <Variable name="$string" value="$string" />
    <Variable name="$string" value="$string" />
    <!-- You can add as many variables as you want. -->
  </LocalVariables>
  <Tasks>
    <Task id="$int" name="$string" description="$string" enabled="true|false">
      <Setting name="$string" value="$string" />
      <Setting name="$string" value="$string" />
      <!-- You can add as many settings as you want. -->
    </Task>
    <Task id="$int" name="$string" description="$string" enabled="true|false">
      <Setting name="$string" value="$string" />
      <Setting name="$string" value="$string" />
    </Task>
    <!-- You can add as many tasks as you want. -->
  </Tasks>
  <!-- This section is optional and described in the samples section. -->
  <ExecutionGraph />
</Workflow>

对于 Cron 工作流,请阅读以下 文档 以获取更多详细信息。

局部变量 在此处 进行了解释。

全局变量 在此处 进行了解释。

任务的 name 选项必须是以下 文档 中列出的名称之一。您可以在 Wexflow 的文档文件夹中找到每个任务的文档。

执行图在 示例部分 中进行了说明。

要了解如何创建自己的工作流,您可以查看 Designer 中可用的工作流示例、示例 部分,并阅读配置文件夹中提供的任务文档。

如果创建了新工作流,或者删除了现有工作流或修改了现有工作流,则无需重启 Wexflow Windows 服务即可使这些修改生效。Wexflow 引擎将自动检测更改并重新加载、添加或删除工作流。

要禁用工作流,可以将工作流的 enabled 设置选项设置为 false

任务之间如何通信?

状态通过 selectFilesselectEntities 设置在任务之间传递。

它的工作方式如下

  1. 工作流中的任务完成其工作并生成文件,然后将其存储在集合中。
  2. 稍后,另一个任务(必须在同一工作流中)可以通过 selectFiles XML 属性引用这些文件,指定生成所需文件的任务的 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="Loading invoices" enabled="true">
            <Setting name="folder" value="C:\WexflowTesting\Invoices\" />
        </Task>
        <!-- some more tasks here -->
        <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>

selectEntities 设置与 selectFiles 的工作方式相同。唯一的区别是 selectEntities 用于处理来自数据库或 Web 服务的自定义对象的任务。要深入了解,请阅读有关实体的 文档

Wexflow 管理器

首次打开 Wexflow Manager 时,将出现一个登录窗口。

以下是登录凭据

  • 用户名: admin
  • 密码: wexflow2018

您可以从后端更改密码。

Wexflow Manager 是一个简单的应用程序,允许您执行以下操作

  • 查看 Wexflow 引擎加载的所有工作流。
  • 查看所选工作流的状态(运行中、暂停、等待审批或已禁用)。
  • 启动工作流。
  • 停止工作流。
  • 暂停工作流。
  • 恢复工作流。
  • 批准审批工作流。
  • 拒绝审批工作流。
  • 后端”按钮打开后端,您可以从中管理工作流、设计工作流、跟踪工作流并获得工作流的实时统计信息。
  • 日志”按钮允许查看当天的日志。
  • 刷新”按钮允许重新加载工作流列表。
  • 重启服务器”按钮允许重启 Wexflow 服务器。
  • 搜索”按钮允许搜索工作流。
  • 帮助”菜单打开帮助页面。
  • 关于”菜单显示 Wexflow 的版本,并检查是否有新版本可用。

要查看 Wexflow 中发生的情况,请在文本编辑器(如 Notepad++)中打开日志文件C:\Program Files\Wexflow\Wexflow.log。Notepad++ 会在日志文件填充时更新它。

后端

后端是一个网站,您可以在 IIS、Apache、NGINX 或任何其他 Web 服务器上托管它。后端也可以本地运行。

后端提供工作流的实时统计信息。它将使您能够轻松灵活地管理、设计和跟踪您的工作流。您可以使用后端轻松访问、配置、管理、维护和开发您的工作流。

登录

首次打开后端时,将出现登录窗口。

以下是登录凭据

  • 用户名: admin
  • 密码: wexflow2018

登录后,您可以从“用户”页面更改密码。

密码重置

如果用户忘记了密码,他可以单击“忘记密码?”链接来重置密码。

当用户单击“提交”按钮时,将向其发送一封包含临时密码的电子邮件,该密码可以在登录后更改。

要允许后端发送电子邮件,必须在 配置 中设置 SMTP 配置。

仪表板

登录后,您将进入仪表板页面。Wexflow 提供了一个漂亮的仪表板,用于查看工作流的实时统计信息。事实上,“仪表板”页面为您提供工作流的实时统计信息,并使您可以轻松详细地跟踪工作流服务器。从仪表板,您还可以按关键字或日期过滤工作流条目。您还可以按日期、名称等对工作流条目进行排序。

管理器

管理器”页面将使您能够管理您的工作流。从此页面,您可以启动工作流、暂停正在运行的工作流、恢复已暂停的工作流、停止正在运行的工作流以及搜索工作流。

设计器

设计器”页面将使您能够设计工作流。从此页面,您可以创建新工作流、编辑现有工作流或删除工作流。使用“设计器”页面,我们可以直观地了解工作流的依赖关系图。每个节点代表一个需要运行的任务。

此外,“设计器”页面还允许通过其 Web XML 或 JSON 编辑器编辑工作流文件。

Ctrl+S保存工作流。

在 XML 或 JSON 视图中按Ctrl+Alt+H以获取键盘快捷键。

审批

审批”页面将使您能够查看所有审批工作流,并使您能够批准或拒绝工作流。

历史

历史记录”页面将使您能够跟踪所有工作流以及工作流服务器上发生的一切。从此页面,您将获得工作流服务器上执行的所有工作流实例的概览。此外,您可以按关键字或日期过滤条目。您还可以按日期、名称等对条目进行排序。

用户

用户”页面允许创建新用户、更改密码和用户信息,以及删除限制访问权限的用户。

具有受限权限的用户只能访问“仪表板”页面和“历史记录”页面。

配置文件

配置文件”页面允许将工作流分配给用户。一旦分配了工作流,用户就可以运行、修改和删除它。

Android 应用

Android 应用允许您执行以下操作

  • 查看 Wexflow 引擎加载的所有工作流
  • 查看所选工作流的状态(运行中、暂停、等待审批或已禁用)
  • 启动工作流
  • 停止工作流
  • 暂停工作流
  • 恢复工作流
  • 批准工作流
  • 拒绝工作流

打开 Android 应用时,您首先需要做的是在设置中设置 Wexflow API URL。

然后,您将看到一个登录屏幕。

以下是登录凭据

  • 用户名: 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="Loading files" enabled="true">
            <Setting name="folder" value="C:\WexflowTesting\Watchfolder1\" />
            <Setting name="folder" value="C:\WexflowTesting\Watchfolder2\" />
        </Task>
        <Task id="2" name="Ftp" description="Uploading files" 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="Moving files to Sent folder" 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

此工作流通过 FFMPEG 将位于 C:\WexflowTesting\WAV\ 文件夹中的 WAV 文件转码为 MP3 格式,并将转码后的文件移至 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="Loading WAV files" enabled="true">
            <Setting name="folder" value="C:\WexflowTesting\WAV\" />
        </Task>
        <Task id="2" name="ProcessLauncher" description="WAV to MP3" enabled="true">
            <Setting name="selectFiles" value="1" />
            <!-- You need to install FFMPEG -->
            <Setting name="processPath" 
             value="C:\Program Files\ffmpeg\bin\ffmpeg.exe" />
            <!-- variables: {$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="Moving MP3 files from temp folder" 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 文件夹。

工作流 4

此工作流等待 WAV 文件到达 C:\WexflowTesting\WAV\,然后通过 VLC 将其转码为 MP3 文件,然后将 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="Loading WAV files" enabled="true">
            <Setting name="folder" value="C:\WexflowTesting\WAV\" />
        </Task>
        <Task id="2" name="ProcessLauncher" description="WAV to MP3" enabled="true">
            <Setting name="selectFiles" value="1" />
            <!-- You need to install VLC-->
            <Setting name="processPath" value="C:\Program Files\VideoLAN\VLC\vlc.exe" />
            <!-- variables: {$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="Uploading MP3 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="2" />
        </Task>
        <Task id="4" name="FilesMover" description="Moving WAV files" 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 任务加载 ProcessLauncher 任务生成的 MP3 文件,然后将其上传到 FTP 服务器。最后,FilesMover 任务将处理过的 WAV 文件移至 C:\WexflowTesting\WAV_processed 文件夹。

如果您想在文件事件上触发任务,您应该使用 FileSystemWatcher 任务以避免产生大量日志。 此处 是一个示例工作流。

工作流 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>

执行图

此工作流加载文件 C:\WexflowTesting\file1.txt,然后将其上传到 FTP 服务器,然后将其移至 C:\WexflowTesting\Sent\ 文件夹。

<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="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="FilesMover" 
         description="Moving files to Sent folder" 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 文件夹。

按照惯例,要执行的第一个任务的父任务 ID 必须始终为 -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>

按照惯例,在节点中要执行的第一个任务的父任务 ID 必须始终为 -1

您可以在执行图中的几乎任何地方添加 If 流程图节点。同样,您可以添加任意数量的节点。您也可以将它们添加到事件节点 OnSuccessOnWarningOnError 中。

一个 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="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>
        <Task id="5" name="Wait" description="Waiting for 2 days..." enabled="true">
            <Setting name="duration" value="02.00:00:00" />
        </Task>
        <Task id="99" name="FileExists" 
         description="Checking trigger file" 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>

按照惯例,在节点中要执行的第一个任务的父任务 ID 必须始终为 -1

您可以在执行图中的几乎任何地方添加 While 流程图节点。同样,您可以添加任意数量的节点。您也可以将它们添加到事件节点 OnSuccessOnWarningOnError 中。

一个 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="Getting current day" enabled="true">
      <Setting name="culture" value="en-US" />  
      <Setting name="format" value="dddd" />
    </Task>
	<Task id="2" name="FilesLoader" description="Loading files" enabled="true">
      <Setting name="file" value="C:\WexflowTesting\file1.txt" />
    </Task>
    <Task id="3" 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="4" name="FilesLoader" description="Loading emails" enabled="true">
      <Setting name="file" value="C:\WexflowTesting\Emails\Emails.xml" />
   </Task>
   <Task id="5" 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>
    <Switch id="100" parent="-1" switch="1">
      <Case value="Monday">
        <Task id="2"><Parent id="-1" /></Task>
		<Task id="3"><Parent id="2" /></Task>
      </Case>
      <Case value="Wednesday">
        <Task id="4"><Parent id="-1" /></Task>
        <Task id="5"><Parent id="4" /></Task>
      </Case>
      <Default />
    </Switch>
  </ExecutionGraph>
</Workflow>

按照惯例,在 Case/Default 节点中要执行的第一个任务的父任务 ID 必须始终为 -1

您可以在执行图中的几乎任何地方添加 Switch 流程图节点。同样,您可以添加任意数量的节点。您也可以将它们添加到事件节点 OnSuccessOnWarningOnError 中。

一个 Switch 可以嵌套在另一个 While、一个 If 和一个 Switch 中。

审批工作流

审批工作流是通过approval设置选项标记为审批的工作流。它们可以从后端的设计器页面或通过 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>

审批工作流必须至少包含一个 Approval 任务。Approval 任务可以放在工作流的任何位置,并且可以有多个。您可以创建一些任务完成后工作流等待批准,然后通知客户的工作流。

工作流的批准可以通过 Wexflow Manager 或后端的 Approval 页面完成。

如果工作流被拒绝,将引发 OnRejected 工作流事件,并且 Approval 任务之后的任务不会执行。

工作流的拒绝可以通过单击后端的 Approval 页面或 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>

这个简单的sequential工作流是一个approval工作流,它在启动前等待批准。一旦批准,这个工作流将等待2秒。这个工作流可以从Wexflow Manager或后端的Approval页面批准或拒绝。

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>

这个简单的sequential工作流是一个approval工作流,它在启动前等待批准。一旦批准,这个工作流将等待2秒。如果这个工作流被拒绝,任务2将不会被执行,任务3将被执行。换句话说,如果这个工作流被拒绝,它将等待3秒。这个工作流可以从Wexflow Manager或后端的Approval页面批准或拒绝。

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="Loading YouTube videos" enabled="true">
		<Setting name="file" value="C:\WexflowTesting\YouTube\YouTube.xml" />
	</Task>
	<Task id="2" name="YouTube" description="Uploading YouTube videos" 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="Waiting for approval" enabled="true" />
	<Task id="4" name="FilesLoader" 
     description="Loading notification mails" enabled="true">
		<Setting name="file" value="C:\WexflowTesting\Mails\mails.xml" />
	</Task>
	<Task id="5" name="MailsSender" 
     description="Sending notification mails" 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 并由管理团队编辑。然后,如果此工作流从后端的 Approval 页面或 Wexflow Manager 获得批准。

当此工作流到达 Approval 任务时,它会暂停其作业并等待审批流程,直到它被批准然后继续其任务。

表单提交审批工作流

这是另一个有趣的审批工作流

<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="Form submission" 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="Waiting for approval" enabled="true" />
		<Task id="3" name="Wait" description="Waiting for 2 seconds" enabled="true">
			<Setting name="duration" value="00.00:00:02" />
		</Task>
		<Task id="4" 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>
		<!-- You can add other tasks here depending on your need. -->
		<Task id="3"><Parent id="2" /></Task>
		<OnRejected>
			<!-- You can add other tasks here depending on your need. -->
			<Task id="4"><Parent id="-1" /></Task>
		</OnRejected>
	</ExecutionGraph>	
</Workflow>

此审批工作流打开一个提交表单并等待批准。如果提交正确,工作流将被批准并等待 2 秒(这只是一个简单的测试任务,但您可以添加电子邮件任务等)。否则,如果提交不正确,工作流将被拒绝并等待 3 秒(这只是一个简单的测试任务,但您可以添加电子邮件任务等)。此工作流仅在 Wexflow 的 .NET Core 版本上运行,因为 Wexflow 的 .NET 版本不支持从 ProcessLauncher 任务打开 GUI,因为 Wexflow 服务器在 .NET 版本中运行在 Windows 服务中。

当某些任务完成后,您必须等待批准以检查先前任务是否已成功完成,然后通知用户等。审批工作流非常有用。这只是一个示例,但您可以根据自己的意愿和需求创建和想象其他示例。

记录

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>

OnWarningOnErrorOnRejected 流程图事件节点可以以相同的方式使用。您可以在事件节点中放置 IfWhile 流程图节点。

对于 OnRejected 工作流事件,工作流必须是审批工作流,并且至少包含一个 Approval 任务。一旦最终用户单击后端的 Approval 页面或 Wexflow Manager 中的拒绝按钮,就会引发 OnRejected 工作流事件。

这些是简单基础的工作流,可以提供关于如何创建自己的工作流的思路。但是,如果您有多个系统、应用程序和自动化参与到工作流中,那么工作流可能会非常有趣。

内置活动

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:此任务监视热文件夹并在文件创建、更改或删除时触发任务。

加密任务

这些任务允许加密和解密任何类型、任何大小的文件。这些任务还允许加密和解密基于文本的文件。

压缩任务

这些任务允许从文件集合创建 .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 文件提取到目标文件夹。

语音任务

这些任务允许文本转语音和语音转文本。

哈希任务

这些任务允许生成文件集合的 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 下载文件。这些任务还允许下载 torrent 文件、ping 服务器以及执行 GET/POST/PUT/PATCH/DELETE 请求。

  • Ftp:此任务允许通过 FTP、FTPS 或 SFTP 列出、上传、下载或删除文件。
  • Http:此任务允许通过 HTTP 或 HTTPS 下载文件。
  • HttpGet:此任务执行 GET 请求。
  • HttpPost:此任务执行 POST 请求。
  • HttpPut:此任务执行 PUT 请求。
  • HttpPatch:此任务执行 PATCH 请求。
  • HttpDelete:此任务执行 DELETE 请求。
  • Torrent:此任务下载 torrent 文件。
  • Ping:这是一个流程图任务,用于检查服务器是否响应 ping 请求。

XML 任务

这些任务允许处理 XML 和 CSV 数据。XSLT 可与 XPath 结合使用来生成 XML 文档。支持 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 Insert)。

WMI 任务

  • Wmi*:此任务执行 WMI 查询并将结果输出到 XML 文件。输出 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 文件。输出 XML 文件的格式在此任务的文档中有描述。
  • YouTube**:此任务将视频上传到 YouTube。
  • YouTubeSearch**:此任务在 YouTube 上搜索内容。
  • YouTubeListUploads**:此任务检索上传到 YouTube 频道的视频列表。
  • Vimeo:此任务将视频上传到 Vimeo。
  • VimeoListUploads:此任务检索上传到 Vimeo 频道的视频列表。

ProcessLauncher 任务可以与 FFMPEG、VLC 或任何其他软件结合使用,以执行音频和视频任务。

电子邮件任务

此任务允许发送或获取电子邮件集合。

  • MailsSender:此任务从 XML 文件发送电子邮件集合。输入 XML 文件的格式在此任务的文档中有描述。
  • MailsReceiver:此任务获取电子邮件集合。

工作流任务

  • Workflow*:此任务允许启动、暂停、恢复、停止、批准或拒绝工作流列表。
  • SubWorkflow:此任务启动一个子工作流。

社交媒体任务

可等待任务

  • Wait:此任务等待指定的持续时间。

报告任务

这些任务允许从 HTML、XML 或 TXT 文件生成 PDF 格式的报告。

  • TextToPdf*:此任务从文本文件生成 PDF 文件。
  • HtmlToPdf*:此任务从 HTML 文件生成 PDF 文件。
  • PdfToText*:此任务从 PDF 文件中提取文本。

Xslt 任务可用于从 XML 文件生成 HTML 报告。然后,可以通过 HtmlToPdf 任务将 HTML 报告转换为 PDF 报告。

Web 任务

这些任务允许从 URL 截屏并下载页面渲染后的 HTML 源代码。这些任务还允许压缩、最小化和压缩 JavaScript、CSS 和 HTML 文件。这些任务还允许从 HTML 文件中提取文本。这些任务还允许将 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:这是一个流程图任务,用于检查服务器是否响应 ping 请求。
  • EnvironmentVariable:这是一个流程图任务,用于检索环境变量的值。
  • MessageCorrect:这是一个流程图任务,用于检查消息是否在具有 checkString 设置选项作为键的任务内存中。
  • FolderExists:这是一个流程图任务,用于检查给定文件夹是否存在于文件系统中。
  • FileContentMatch:此任务检查文件内容是否匹配正则表达式。

审批任务

  • Approval:此任务将当前工作流标记为需要批准。
  • ApproveRecord:此任务将记录分配给用户并启动对该记录的审批流程。
  • ApprovalRecordsCreator:此任务从文件创建记录。
  • ApprovalWorkflowsCreator:此任务为记录从共享内存创建审批工作流并启动它们。记录 ID 从 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”,甚至“每周一、周三和周五上午 9:00 到 10:00 之间的每 5 分钟”。

Cron 表达式是一个由 6 或 7 个字段组成的字符串,字段之间用空格分隔。字段可以包含任何允许的值,以及该字段允许的特殊字符的各种组合。字段如下

*    *    *    *    *    *     *  
┬    ┬    ┬    ┬    ┬    ┬     ┬
│    │    │    │    │    │     └ Year (1970 - 2099) (Optional) (Allowed Special Characters: , - * /)
│    │    │    │    │    └────── Day of week (1 - 7) (Sunday=1) (Allowed Special Characters: , - * ? / L #)
│    │    │    │    └─────────── Month (1 - 12) (Jan=1) (Allowed Special Characters: , - * /)
│    │    │    └──────────────── Day of month (1 - 31) (Allowed Special Characters: , - * ? / L W)
│    │    └───────────────────── Hours (0 - 23) (Allowed Special Characters: , - * /)
│    └────────────────────────── Minutes (0 - 59) (Allowed Special Characters: , - * /)
└─────────────────────────────── Seconds (0 - 59) (Allowed Special Characters: , - * /)

因此,Cron 表达式可以像这样简单:* * * * ? *

或更复杂的,如下所示:0/5 14,18,3-39,52 * ? 1月,3月,9月 周一-周五 2002-2010

请注意

Wexflow 使用 Quartz.NET cron 表达式。UNIX Cron 表达式和 Quartz 的不同。简单来说

  • 在 Unix 中
    (minute, hour, day, month, day_of_week, year)
  • 在 Quartz 中
    (second, minute, hour, day, month, day_of_week, year)

特殊字符

  • "" (“所有值”) - 用于选择字段中的所有值。例如,分钟字段中的 "" 表示“每分钟”。
  • ? (“无特定值”) - 当您需要在允许该字符的两个字段之一中指定内容,但在另一个字段中不指定时,此字符非常有用。例如,如果您希望工作流在每个月的某一天(例如第10天)触发,而不在乎是星期几,您可以在“日”字段中放入“10”,在“星期”字段中放入“?”。请参见下面的示例以Clarify。
  • - 用于指定范围。例如,小时字段中的“10-12”表示“10点、11点和12点”。
  • , 用于指定其他值。例如,星期字段中的“MON,WED,FRI”表示“星期一、星期三和星期五”。
  • / - 用于指定增量。例如,秒字段中的“0/15”表示“0秒、15秒、30秒和45秒”。而秒字段中的“5/15”表示“5秒、20秒、35秒和50秒”。您也可以在“”字符后指定“/” - 在这种情况下,“”等同于在“/”之前有“0”。日字段中的“1/3”表示“从每月的第一天开始,每3天触发一次”。
  • L (“最后”) - 在允许该字符的两个字段中具有不同的含义。例如,日字段中的值“L”表示“该月的最后一天” - 1月是31日,非闰年的2月是28日。如果仅在星期字段中使用,它仅表示“7”或“SAT”。但如果在星期字段中与其他值一起使用,则表示“该月的最后一个 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”=该月的第3个)。其他示例:“2#1”=该月的第一个星期一,“4#5”=该月的第五个星期三。请注意,如果您指定“#5”,并且该月的给定星期数没有5个,那么该月将不会触发。** 合法的字符以及月份和星期几的名称不区分大小写。MON 和 mon 相同。

示例

以下是一些示例

0 0 12 * * ?	         Fire at 12pm (noon) every day.
0 15 10 ? * *	         Fire at 10:15am every day.
0 15 10 * * ?	         Fire at 10:15am every day.
0 15 10 * * ? *	         Fire at 10:15am every day.
0 15 10 * * ? 2019       Fire at 10:15am every day during the year 2019.
0 * 14 * * ?	         Fire every minute starting at 2pm and ending at 2:59pm, every day.
0 0/5 14 * * ?	         Fire every 5 minutes starting at 2pm and ending at 2:55pm, 
                         every day.
0 0/5 14,18 * * ?        Fire every 5 minutes starting at 2pm and ending at 2:55pm, 
                         AND fire every 5 minutes starting at 6pm and ending at 6:55pm, 
                         every day.
0 0-5 14 * * ?	         Fire every minute starting at 2pm and ending at 2:05pm, every day.
0 10,44 14 ? 3 WED       Fire at 2:10pm and at 2:44pm 
                         every Wednesday in the month of March.
0 15 10 ? * MON-FRI      Fire at 10:15am every Monday, Tuesday, Wednesday, 
                         Thursday and Friday.
0 15 10 15 * ?	         Fire at 10:15am on the 15th day of every month.
0 15 10 L * ?	         Fire at 10:15am on the last day of every month.
0 15 10 L-2 * ?	         Fire at 10:15am on the 2nd-to-last last day of every month.
0 15 10 ? * 6L	         Fire at 10:15am on the last Friday of every month.
0 15 10 ? * 6L	         Fire at 10:15am on the last Friday of every month.
0 15 10 ? * 6L 2019-2020 Fire at 10:15am on every last friday of every month 
                         during the years 2019 and 2020.
0 15 10 ? * 6#3	         Fire at 10:15am on the third Friday of every month.
0 0 12 1/5 * ?	         Fire at 12pm (noon) every 5 days every month, 
                         starting on the first day of the month.
0 11 11 11 11 ?	         Fire every November 11th at 11:11am.

请注意“?”和“*”在星期和日期字段中的影响!

Cron 启动类型

可以通过 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 * * * ?" /> <!-- Every two minutes -->
    <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 的配置文件C:\Program Files\Wexflow\Wexflow.Clients.WindowsService.exe.config 中使用log4net.Appender.SmtpAppender来配置 Wexflow 在发生错误时发送事件报告。以下是一个示例配置

<appender name="SmtpAppender" type="log4net.Appender.SmtpAppender">
    <to value="foo@bar.com" />
    <from value="baz@bar.com" />
    <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 提供了一个美观的 Dashboard,用于查看流程的实时统计信息。Dashboard 可以让您轻松跟踪您的流程服务器。

后端中的“历史记录”页面也将允许您跟踪所有流程以及工作流服务器上发生的一切。确实,从这个页面,您将可以概览工作流服务器上执行的所有工作流实例。

自定义活动

自定义任务在工作流引擎中是必须的,并允许系统和应用程序进行交互。

要创建自定义任务,例如MyTask,您需要按以下步骤操作

  1. 在 Visual Studio 中创建一个新的类库项目,并将其命名为Wexflow.Tasks.MyTask。对于 .NET,您必须将目标定位为 .NET 4.8。对于 .NET Core,您必须将目标定位为 .NET 6。
  2. 通过 nuget 包管理器引用 Wexflow 依赖项
    PM> Install-Package Wexflow

    或使用 .NET CLI(.NET Core 版本)

    dotnet add package Wexflow
  3. 创建一个实现abstractWexflow.Core.Taskpublic classMyTask

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)
        {
            // Task settings goes here
        }

        public override TaskStatus Run()
        {
            try
            {
                // Task logic goes here

                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属性是为流程图任务设计的。除了任务的状态外,流程图任务在执行其操作后会返回truefalse

顺序任务的Condition属性应始终设置为false

SwitchValue用于Switch流程图节点。如果您在SwitchValue属性中设置了一个值,并在Switch流程图节点中使用此任务,则将执行与该值对应的 case。否则,如果设置了Default case,则将执行该 case。

您可以使用适合您需求的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\的路径可以通过 Wexflow 的配置文件C:\Wexflow\Wexflow.xml中的tasksFolder设置进行配置。

然后,您的自定义任务就可以这样使用了

<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 Manager 的工作流列表中。之后,您可以从那里启动它。

.NET Core

如果您使用 Wexflow 的 .NET Core 版本,在创建了自定义任务 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

更新

如果您想更新自定义任务,请按照文档中的说明复制自定义任务及其引用,然后重启 Wexflow 服务器

  • .NET: 重启 Wexflow Windows 服务
  • .NET Core:
    • Windows: .\run.bat
    • Linux: sudo systemctl restart wexflow
    • macOS: dotnet /Applications/wexflow/Wexflow.Server/Wexflow.Server.dll

暂停/恢复

对于 .NET Core,如果您想为自定义任务启用暂停/恢复功能,您需要在自定义任务中使用this.WaitOne();。以下是一个示例

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)
        {
            // Task settings goes here
        }

        public override TaskStatus Run()
        {
            try
            {
                foreach(var file in SelectFiles())
                {
                    // process file...
                    WaitOne();
                }

                return new TaskStatus(Status.Success);
            }
            catch (ThreadAbortException)
            {
                throw;
            }
        }
    }
}

引用的程序集

如果您的自定义任务有引用的程序集,您必须将它们复制到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);

文件

文件可以通过调用AddAddRange方法在任务中加载

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

然后,加载的文件可以通过它们的任务Id在其他任务中选择,如下所示

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

要通过selectFiles设置选项选择工作流运行实例加载的文件,您可以这样做

FileInf[] files = this.SelectFiles();

实体

Entity 是一个abstract类,具有任务的Id属性

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

Entity 类设计为被其他类继承,例如从数据库、Web 服务或 API 等检索的对象。然后,可以通过调用AddAddRange方法在任务中加载这些对象

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

然后,加载的实体可以通过它们的任务Id在其他任务中选择,如下所示

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

实体设计用于自定义任务。

要通过selectEntities设置选项选择工作流运行实例加载的实体,您可以这样做

Entity[] entities = this.SelectEntities();

Entity类在处理来自数据库或 Web 服务等的对象的自定义任务时非常有用。

共享内存

任务包含一个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."},
]

如果您使用 Wexflow 的 .NET Core 版本,则需要编辑此文件

  • 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": ""} ],
}

如果您使用 Wexflow 的 .NET Core 版本,则需要编辑此文件

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

可用的类型有

  • 字符串
  • int
  • bool
  • 密码
  • 列表
  • 用户

user类型指的是 Wexflow 中的注册用户。

如果您选择list类型,您必须设置可用的列表选项。这是一个示例

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

就是这样。MyTask 将出现在设计器中,并且在被选中时,它的设置也会显示出来。

调试

要调试自定义任务,您可以使用日志记录。

您还可以克隆 Wexflow 的存储库,在 Visual Studio 中打开Wexflow.sln,并按照以下指南从代码运行 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包含WexflowWebServiceUriUsernamePassword设置。

Windows (.NET Core)

命令行工具位于.\Wexflow.Clients.CommandLine。要运行命令行工具,只需运行以下命令

cd .\Wexflow.Clients.CommandLine
dotnet Wexflow.Clients.CommandLine.dll

配置文件.\Wexflow.Clients.CommandLine\appsettings.json包含WexflowWebServiceUriUsernamePassword设置。

Linux

在 Linux 上安装 Wexflow 后,命令行工具位于/opt/wexflow/Wexflow.Clients.CommandLine。要运行命令行工具,只需运行以下命令

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

配置文件/opt/wexflow/Wexflow.Clients.CommandLine/appsettings.json包含WexflowWebServiceUriUsernamePassword设置。

macOS

在 macOS 上安装 Wexflow 后,命令行工具位于/Applications/wexflow/Wexflow.Clients.CommandLine。要运行命令行工具,只需运行以下命令

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

配置文件/Applications/wexflow/Wexflow.Clients.CommandLine/appsettings.json包含WexflowWebServiceUriUsernamePassword设置。

选项

-o, --operation     Required. start|suspend|resume|stop|approve|reject

-i, --workflowId    Required. Workflow Id

-j, --jobId         Job instance id (Guid)

-w, --wait          (Default: false) Wait until workflow finishes

--help              Display this help screen.

--version           Display version information.

示例

触发并等待

以下命令启动工作流 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 是一个独立的、与语言无关的解决方案,可以通过 RESTful API 集成到运行 PHP、NodeJS、Ruby、Python 等的应用程序中。

所有 API 方法都使用基本身份验证。因此,必须在每个 API 调用中设置 Authorization 标头。

密码必须用 MD5 校验和加密。

以下是用户 admin 的 Authorization 标头示例

Authorization Basic YWRtaW46ZWUwNWVhYWJhN2I3NmYxNmUyODVkOTgzZDYwNWM5YmY=

其对应于用户名:md5(密码) 的 base64 编码

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

用户 admin 的默认密码是 wexflow2018。您可以在后端更改它。

您可以通过以下地址访问 Swagger UI: https://:8000

仪表板

GET https://:8000/api/v1/status-count
返回状态计数。

GET https://:8000/api/v1/entries-count-by-date?s={keyword}&from={date}&to={date}
按关键字和日期过滤器返回条目计数。

GET https://:8000/api/v1/search-entries-by-page-order-by?s={keyword}&from={date}&to={date}&page={page}&entriesCount={entriesCount}&heo={orderBy}
搜索条目。

GET https://:8000/api/v1/entry-status-date-min
返回条目的最小日期。

GET https://:8000/api/v1/entry-status-date-max
返回条目的最大日期。

管理器

GET https://:8000/api/v1/search?s={keyword}
搜索工作流。

GET https://:8000/api/v1/search-approval-workflows?s={keyword}
搜索审批工作流。

GET https://:8000/api/v1/workflow?w={id}
根据 ID 返回工作流。

POST https://:8000/api/v1/start?w={id}
启动一个工作流。

POST https://: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 https://:8000/api/v1/stop?w={id}
停止一个工作流。

POST https://:8000/api/v1/suspend?w={id}
暂停一个工作流。

POST https://:8000/api/v1/resume?w={id}
恢复一个工作流。

POST https://:8000/api/v1/approve?w={id}
批准一个工作流。

POST https://:8000/api/v1/disapprove?w={id}
拒绝一个工作流。

设计器

GET https://:8000/api/v1/tasks/{id}
返回工作流的任务。

GET https://:8000/api/v1/xml/{id}
以 XML 格式返回工作流。

GET https://:8000/api/v1/json/{id}
以 JSON 格式返回工作流。

GET https://:8000/api/v1/task-names
返回任务名称。

GET https://:8000/api/v1/settings/{taskName}
返回任务设置。

POST https://:8000/api/v1/task-to-xml
以 XML 格式返回任务。

GET https://:8000/api/v1/is-workflow-id-valid/{id}
检查工作流 ID 是否有效。

GET https://:8000/api/v1/is-cron-expression-valid?e={cronExpression}
检查 cron 表达式是否有效。

GET https://:8000/api/v1/is-period-valid/{period}
检查周期是否有效。

POST https://:8000/api/v1/is-xml-workflow-valid
检查工作流的 XML 是否有效。

POST https://:8000/api/v1/save-xml
从 XML 保存工作流。

POST https://:8000/api/v1/save
从 JSON 保存工作流。

POST https://:8000/api/v1/delete?w={id}
删除一个工作流。

POST https://:8000/api/v1/delete-workflows
删除工作流。

GET https://:8000/api/v1/graph/{id}
返回工作流的执行图。

历史

GET https://:8000/api/v1/history-entries-count-by-date?s={keyword}&from={date}&to={date}
按关键字和日期过滤器返回历史条目计数。

GET https://:8000/api/v1/search-history-entries-by-page-order-by?s={keyword}&from={date}&to={date}&page={page}&entriesCount={entriesCount}&heo={orderBy}
搜索历史条目。

GET https://:8000/api/v1/history-entry-status-date-min
返回历史条目的最小日期。

GET https://:8000/api/v1/history-entry-status-date-max
返回历史条目的最大日期。

用户

GET https://:8000/api/v1/user?username={username}
根据用户名返回用户。

GET https://:8000/api/v1/search-users?keyword={keyword}&uo={orderBy}
搜索用户。

POST https://:8000/api/v1/insert-user?username={username}&password={password}&up={userProfile}&email={email}
插入一个用户。

POST https://:8000/api/v1/update-user?userId={userId}&username={username}&password={password}&up={userProfile}&email={email}
更新一个用户。

POST https://:8000/api/v1/update-username-email-user-profile?userId={userId}&username={username}&password={password}&up={userProfile}&email={email}
更新用户的用户名、电子邮件和用户配置文件。

POST https://:8000/api/v1/delete-user?username={username}&password={password}
删除一个用户。

POST https://:8000/api/v1/reset-password?username={username}
重置密码。

配置文件

GET https://:8000/api/v1/search-admins?keyword={keyword}&uo={orderBy}
搜索管理员。

GET https://:8000/api/v1/user-workflows?u={userId}
返回用户的工作流。

POST https://:8000/api/v1/save-user-workflows
保存用户工作流关系。

从源码运行

要在 Windows 上从代码运行 Wexflow,请按以下步骤操作

  • 将源代码克隆到您的计算机
    git clone https://github.com/aelassas/wexflow.git
  • 安装 Visual Studio。
  • .NET: 将“Wexflow”和“WexflowTesting”文件夹复制到C:\。您可以从这里下载。
  • .NET Core: 将“Wexflow-dotnet-core”和“WexflowTesting”文件夹复制到C:\。您可以从这里下载。
  • 如果您已安装 Wexflow,请确保 Wexflow Windows 服务已停止并且端口 8000 可用。否则,您可以在设置中更改端口。
  • 通过以下命令恢复 nuget 包
    nuget restore Wexflow.sln
  • 在 Visual Studio 中打开Wexflow.sln
  • 确保所有项目都设置为Debug Any CPU
  • 确保Wexflow.Server设置为启动项目。
  • 调试项目Wexflow.Server以在调试模式下启动 Wexflow Server。
  • 调试项目Wexflow.Clients.Manager以在调试模式下启动 Wexflow Manager,或打开后端并从那里触发您的工作流。

历史

© . All rights reserved.