工作流
# 工作流
TaskRunner 可用作企业的业务流程管理(BPM),通过工作流的设置,可以实现任务的图形化展示,向比较于代码,工作流的方式可以帮助用户理解整个任务运行的总体状况。
# 1. 创建工作流
在工作流
界面中,点击[新建]
按钮,打开新建流程
窗口,填写流程名称与流程描述说明内容,点击[保存]
按钮。
选择刚才创建的流程,点击[设计]
按钮,进入流程图设计器窗口。

# 2. 流程图设计器
在流程图设计器中,可以操作执行多项工作。以下是最常见的任务:
向图标中添加节点
要向图表中添加节点,请单击节点工具栏中的某个节点,然后单击图表中要插入节点的位置(或者按下鼠标按钮,移动鼠标并释放按钮,以插入具有指定大小的节点)。
在节点之间创建流转连接
可以通过在工具栏中选择以下图示中的其中一种流转连接类型来在节点之间创建流转连接:
选择流转连接类型后,在源节点的任何流转连接点(流转连接点是图表节点中显示的蓝色“x”)中按下鼠标按钮,拖动鼠标,然后在目标节点的任何流转连接点中松开鼠标按钮。将创建一个流转连接,将源节点流转连接到目标节点。
更改图表节点的外观
可以使用菜单和工具栏中的某些选项来更改图表节点的视觉外观。您可以更改背景颜色、边框颜色、边框样式、画笔样式、笔宽、字体等。图表节点的外观不会影响工作流定义的行为方式,它只是为了视觉美观的目的。
保存
构建图表后,通过选择菜单选项[文件]
-[保存]
,或按工具栏中的保存按钮。
工作流定义选项
点击菜单栏中的工作流
,可以操作工作流定义的特定选项,比如工作流变量与工作流附件。
工作流验证
通过按 Ctrl+F9 或选择菜单选项[工作流]-[检查流程图]
时,将调用工作流定义验证器,该验证器将检查工作流中的问题。如果工作流定义有任何问题,编辑器底部将显示一个包含错误和警告的面板:
# 3. 运行工作流
在TaskRunner中,可通过以下方式,实现工作流的运行:
- 使用RestAPI呼叫运行:RestAPI执行工作流
- 使用websocket呼叫运行:WebSocket执行工作流
- 使用MQTT呼叫运行:MQTT执行工作流
- 在自定程序中使用函数运行:UGCM.RunWorkFlow
- 在工作流中使用运行工作流节点运行:运行工作流节点
# 4. 流程图节点
节点是您放置在工作流图表中的内容。它可以是执行指定操作、流转连接或控制执行流程的一些特殊节点。
# 4.1. 开始节点
- 概述:用于指示从哪个位置开始运行流程。
- 允许的输入数量:0
- 允许的输出数量:1
- 描述:一个工作流的流程图中只能存在一个开始节点。
# 4.2. 结束节点
- 概述:用于指示结束流程运行的位置。
- 允许的输入数量:多个
- 允许的输出数量:0
- 描述:一个工作流的流程图中只能存在一个结束节点。
# 4.3. 错误节点
- 概述:当在执行工作流时发生错误,将执行错误节点。
- 允许的输入数量:0
- 允许的输出数量:1
- 描述:一个工作流的流程图中只能存在一个错误节点。每当在工作流执行过程中发生错误时,执行流程都会转到错误块,然后按照它指定的路径(错误块之后的下一个块)进行操作。您可以使用错误块来执行一些清理,然后完成工作流的执行。
# 4.4. 源连接器
- 概述:源连接器是一个直通模块,用来提高图表的可读性,用来将运行流程指向目标连接器。
- 允许的输入数量:多个
- 允许的输出数量:0
- 描述:如果运行的流程到达源连接器,则运行的流程会跳转至与源连接器相关联的目标连接器。源连接器与目标连接器之间的关联是由它们内部设置的文本实现的,如果源连接器与目标连接器中显示的文本相同,则建立起连接。比如,当流程图运行至标记为
A
的源连接器时,它会跳转到标记为A
的目标连接器。这样,您可以在单个关系图中拥有多个源-目标连接。
# 4.5. 目标连接器
- 概述:目标连接器是一个直通模块,用来提高图表的可读性,用来将运行流程指向源连接器。
- 允许的输入数量:0
- 允许的输出数量:1
- 描述:如果运行的流程到达源连接器,则运行的流程会跳转至与源连接器相关联的目标连接器。源连接器与目标连接器之间的关联是由它们内部设置的文本实现的,如果源连接器与目标连接器中显示的文本相同,则建立起连接。比如,当流程图运行至标记为
A
的源连接器时,它会跳转到标记为A
的目标连接器。这样,您可以在单个关系图中拥有多个源-目标连接。
# 4.6. 流转连接
概述:将一个节点连接至另一个节点,用来指示图标的执行流程。
描述:使用流转连接将一个节点连接至另一个节点,表示执行的流程,就是从源节点流向目标节点。可以通过按住鼠标按钮在源块的一个连接点(块中的蓝色"x")上,拖动鼠标,并在目标块的一个连接点上释放按钮来创建流转连接。
箭头指示的是执行的流程。创建的流转连接类型有普通流转连接、侧边流转连接以及弧形流转连接。他们的行为是相同的,仅在视觉效果上有差异。
根据节点允许的输入和输出数量,可能无法流转连接到部分节点。比如,您无法创建一个目标为开始节点的流转连接,因为开始节点不允许输入。
一些节点允许多个流转连接作为输出,在这种情况下,每个流转连接都需要被标记,以便流程图根据指定的条件判断要执行哪个流转连接,流程在离开节点时只能执行其中一个流转连接。比如两个流转连接都连接到了决策节点的输出,其中一个被标记为
是
,另一个标记为否
,以便图表知道根据决策条件的结果应该执行哪个连接。还可以为流转连接指定运行的脚本,当执行流转连接的时候,其中的脚本将被执行。在流转连接的对话框中有一个名为脚本的标签,可以在其中编写要使用的脚本。当流转连接中使用了脚本,在流转连接的起始位置可以看到一个小闪电的图标。
# 4.7. 分叉对象
- 概述:创建并行执行的路径。
- 允许的输入数量:多个
- 允许的输出数量:多个
- 描述:分叉对象用于创建并行执行路径。当一个工作流实例的图表启动时,有一个单一的执行路径(由开始节点启动)。如果执行到达一个分叉对象,流程就会根据分叉的输出数量被分割成多个并行路径,并同时执行。最终,所有的执行路径都必须在同一个合并对象处结束,否则图表就是不正确的。一旦所有并行执行路径完成,主执行路径将再次从合并对象处开始。
# 4.8. 合并对象
- 概述:结束由分叉对象创建的并行执行路径。
- 允许的输入数量:多个
- 允许的输出数量:1
- 描述:合并对象用于结束并合并并行执行路径。当一个工作流实例的图表启动时,存在一个单一的执行路径(由开始节点启动)。如果执行到达一个分叉对象,流程会根据分叉的输出数量被分割成多个并行路径,并同时执行。最终,所有执行路径都必须在同一个合并对象处结束,否则图表就是不正确的。一旦所有并行执行路径完成,主执行路径将再次从合并对象处开始。主执行路径将在合并对象处重新启动,通过连接到其输出的下一个节点继续执行。只有在由分叉对象创建的所有执行路径都完成后,主执行路径才会重新启动。
# 4.9. 决策节点
- 概述:根据布尔条件(是与否)更改执行流程。
- 允许的输入数量:多个
- 允许的输出数量:2(是或否)
- 描述:使用决策节点根据布尔条件改变执行流程。当执行流程到达决策节点时,会评估该节点的条件。如果条件为是,则执行路径通过标记为“是”的流转连接。如果条件为否,则通过标记为“否”的流转连接。
# 4.10. 任务节点
概述:根据任意定义为用户创建任务实例。
允许的输入数量:多个
允许的输出数量:多个(仅限于状态列表)
描述:任务节点是关系图中更重要的节点类型之一。 使用任务节点,您可以指定要为其创建的任务定义用户。当执行流到达任务节点时,它会创建任务每个任务定义的实例。任务节点本身只不过是一组任务定义。因此,要使用任务节点,只需创建一个或多个任务定义并设置任务定义属性。
工作流执行将在任务节点处暂停,直到所有任务实例完成。当任务实例的状态变为完成状态时,任务实例即被视为完成。所有任务实例完成后,执行流程将继续,根据以下规则:
- 任务节点只有一个输出:执行流程将通过该路径。
- 任务节点有两个或更多输出:每个输出流转连接必须用一个完成状态的名称标记。执行路径将通过标记与任务节点输出相同文本的流转连接,即任务实例的完成状态,例如,如果任务实例以“批准”(一个有效的完成状态)完成,则执行路径将通过标记为“批准”的转换。
如果任务节点创建了多个任务实例,无论是来自同一任务定义还是来自不同的任务定义,那么任务节点的输出将是任务实例中最普遍的完成状态。例如,如果两个任务实例完成为“拒绝”,而一个任务实例完成为“批准”,那么任务节点的输出将是“拒绝”,执行路径将跟随标记为“拒绝”的流转连接。
# 4.10.1. 任务定义属性
任务定义是在任务节点的任务定义编辑器(任务对话框)中创建的。当双击任务节点时,会显示一个对话框。可以使用[添加]
或[删除]
按钮来添加或删除任务定义。对话框左侧的列表视图显示了节点现有的任务定义。任务定义的名称会显示出来。
左侧显示的内容为任务定义的名称,它是唯一标识任务定义的有效标识符。在以下示例为SetDateTask
。
常规
状态:
- 状态列表:包含任务有效状态的列表。任务的初始状态将是列表中的第一个状态。通过勾选“完成”选项,一些状态可以被标记为完成状态。当任务实例的状态变为完成状态时,任务被认为已完成。您可以有多个状态被标记为完成状态。勾选了“隐藏”选项的状态是任务的一个可能状态,但不会在用户界面中显示以供更改任务状态(比如在状态下拉框中)。当任务实例被创建时,有效状态会在任务列表对话框中的一个下拉框里显示,然后用户可以更改任务的状态。如果您的应用程序中预定义了状态模板,用户将能够使用
[增加]
按钮右侧的向下箭头按钮选择其中一个模板。
- 状态列表:包含任务有效状态的列表。任务的初始状态将是列表中的第一个状态。通过勾选“完成”选项,一些状态可以被标记为完成状态。当任务实例的状态变为完成状态时,任务被认为已完成。您可以有多个状态被标记为完成状态。勾选了“隐藏”选项的状态是任务的一个可能状态,但不会在用户界面中显示以供更改任务状态(比如在状态下拉框中)。当任务实例被创建时,有效状态会在任务列表对话框中的一个下拉框里显示,然后用户可以更改任务的状态。如果您的应用程序中预定义了状态模板,用户将能够使用
附件:定义了用户在处理附件时的权限。
- 显示附件:在任务列表中显示附件标签。如果设置为未勾选,用户将无法进行任何与附件相关的操作
[添加]
、[查看]
等)。如果设置为勾选,用户至少能够打开并查看附件。 - 允许移除附件:如果设置为勾选,允许用户从任务实例中移除附件。
- 允许插入附件:如果设置为勾选,允许用户向任务实例中插入新的附件。
- 允许编辑附件:如果设置为勾选,允许用户打开现有附件进行编辑,并更新其内容。
- 显示附件:在任务列表中显示附件标签。如果设置为未勾选,用户将无法进行任何与附件相关的操作
字段:待补充说明。
过期:待补充说明。
# 4.11. 审批节点
- 概述:这是一个特殊的任务节点,具有单个审批任务定义。
- 允许的输入数量:多个
- 允许的输出数量:多个(仅限于状态列表)
- 描述:审批块只是一个任务块,它有一个 任务定义。此任务定义是审批任务定义,并且是常规任务 定义,不同之处在于某些属性已经存在 已初始化,包含主题、描述,特别是状态 列表。审批任务的状态列表中有三个有效状态:“已打开”、“已批准”和“已拒绝”。“已批准”和“已拒绝”状态是任务的完成状态。可以根据需要更改审批任务定义属性,就像在任务块中一样。与任务块的唯一区别是,您不能在审批块中创建多个任务。
# 4.12. 脚本节点
概述:执行脚本代码。
允许的输入数量:多个。
允许的输出数量:1(如果脚本不返回任何值)或多个(取决于可能的脚本结果)。
描述:脚本节点只执行一个脚本代码。在大多数情况下,脚本节点将只有一个输出。但您也可以从脚本节点中使用多个输出,这将取决于脚本结果。您可以定义使用
result
变量编写Result
脚本:result := 'result1';
1如果您有多个输出,则每个离开流转连接都应该有一个标签,执行流将采取与脚本结果相同的标签的流转连接。在上面的示例中,您必须有一个标记为
result1
的流转连接,以便执行将遵循该路径。
# 4.13. 运行工作流节点
概述:运行单独的工作流实例。
允许的输入数量:多个。
允许的输出数量:1
描述:运行工作流节点允许运行新的工作流(子工作流), 与当前实例分离,采用同步或异步方式。为了在工作流实例之间交换信息,一个变量映射应在节点定义中指定。
如果选中了
等待到结束
,则当前工作流将等待子工作流完成,以便继续。在这种情况下,变量映射是双向的。如果未选中
等待到结束
,则无论子工作流状态如何,当前工作流都将继续正常执行。变量映射只是单向的。变量映射列出了子工作流中的哪些变量将进行更新。在双向映射的情况下,当子工作流完成时,子工作流中的变量将更新主工作流中对应的变量值。
# 4.14. 数据库SQL节点
概述:在数据库中执行SQL语句,仅支持TaskRunner配置数据库的连接。
允许的输入数量:多个
允许的输出数量:1
描述:此节点允许在数据库中执行查询的SQL语句,可以在SQL语句中使用表达式。
参数:SQL语句:包含要在数据库中执行的SQL语句。支持表达式。例如:
Update Invoice Set Status = 3 Where InvoiceId = [InvoiceId]
1
# 4.15. 发送邮件节点
- 概述:发送电子邮件。
- 允许的输入数量:多个
- 允许的输出数量:1
- 描述:此节点使用TaskRunner中默认的邮件设置实现邮件发送的功能。
# 4.16. MQTT发送节点
- 概述:发送MQTT消息。
- 允许的输入数量:多个
- 允许的输出数量:1
- 描述:此节点使用TaskRunner中默认的MQTT连接设置实现MQTT消息发送的功能。
# 4.17. 工具SQL节点
- 概述:执行SQL查询。
- 允许的输入数量:多个
- 允许的输出数量:1
- 描述:用于执行SQL查询,数据库处填写要连接的数据库设置的名称。SQL语句处填写要执行的SQL语句。
# 4.18. WebSocket节点
- 概述:用于发送websocket消息,使用TaskRunner的客户端实现消息的发送。
- 允许的输入数量:多个
- 允许的输出数量:1
- 描述:发送websocket消息文本,使用TaskRunner的websocket客户端实现消息发送的功能。
# 4.19. 注释节点
- 概述:显示注释。
- 允许的输入数量:0
- 允许的输出数量:0
- 描述:将视觉元素添加到包含固定文本的图表中。此节点不影响图表的行为,仅用于视觉指示。如果需要支持表达式的文本, 使用文本节点。
# 4.20. 文本节点
- 概述:在图标中显示动态的文本。
- 允许的输入数量:0
- 允许的输出数量:0
- 描述:使用此节点可在图表的任何地方显示文本,该文本可以根据工作流上下文进行更改。这两者之间的主要区别:文本节点和注释节点相比,支持表达式。所以你可以用它来显示日期、变量值等,覆盖或关闭任何其他图表对象。
# 5. 变量
工作流变量在工作流中,名程为槽(slot)
,可以在其中保存信息,就像程序中的变量一样。可以在工作流定义中创建变量,从工作流定义创建的每个工作流实例都将具有该工作流变量的副本。
如需要定义工作流中使用的变量,请执行以下操作。
打开工作流定义编辑器。
打开菜单选项
[工作流]-[变量]
,将显示变量编辑器。
变量编辑器显示已定义的工作流变量的列表。可以使用[添加]
和[删除]
按钮添加和删除变量。需要做的就是为变量定义一个名称,或者可以在值
编辑框中定义变量的起始值。还可以使用描述
字段向变量添加注释,解释其用途(变量的文档)。定义工作流变量后,可以在表达式和脚本中使用它们。也可以在使用外部呼叫运行工作流时向这些变量传入初始值。
# 6. 附件
附件是一项强大的功能,它允许每个工作流实例具有一个或多个与之关联的文件。用户可以在处理任务时添加、编辑或删除附件(取决于他们的附件权限)。
用户可以将一个文件(或一组文件)附加到一个任务,然后可以为另一个用户创建另一个任务,并且这个新用户可以看到前一个附加的文件。或者,用户可以在工作流执行过程中编辑和更新附件。这使得在执行工作流实例时用户之间的协作更加牢固。
附件实际上是一组文件(附件项)的容器。可以在工作流定义中创建这些“容器”(附件),也可以创建多个附件。默认情况下,始终在工作流定义中创建一个名为“附件”的附件。
# 7. 表达式
表达式是自定义工作流定义的一种强大方法。您可以在某些节点的多个属性中使用表达式,特别是在任务节点的任务定义属性中使用表达式。当要使用该属性时,文本中的所有表达式都将转换为其值。表达式由括号[
和]
标识。以下是表达式用法的示例:
主题:这是一个关于订单号 [OrderNo] 的主题。
描述:[UserName] 先生,请在 [DateToStr(StartDate + 30)] 前处理完成此任务。
2
在这些示例中,我们有三个表达式:OrderNo、UserName 和 DateToStr(StartDate + 30)。请注意,表达式使用工作流变量。工作流变量的值将在表达式中计算和使用。例如,在计算表达式后,结果文本为:
主题:这是一个关于订单号 1042 的主题。
描述:李子明 先生,请在在 2020年5月12日 前处理完成此任务。
2
除了工作流变量,表达式还接受:
- 运算符:
+,-, /, *, div, mod
- 逻辑运算符:
and, or, not, xor
- 关系运算符:
<>, =, <, >, <=, >=
- 按位运算符:
shl, shr
- 数值常量:
153(整数), 152.43(十进制), $AA(十六进制)
- 字符串常量:
'这是一串文字'
- 字符常量:
#13(返回字符)
- 类似pascal的函数与程序:可参考TaskRunner中的系统函数、系统程序。
# 8. 脚本
可以在工作流程图中使用脚本。脚本是自定义工作流定义的强大方法。您可以使用脚本块执行其他块无法执行的各种任务。script 的默认语法语言是PascalScript。所以,你几乎可以做你在普通Pascal中能做的所有事情。关于PascalScript的语法相关的内容请参考PascalScript基础。工作流中的脚本也同样支持TaskRunner的系统函数、系统程序、自定函数和自定程序。
脚本也是操作工作流变量的一种方式。在脚本中,它们只是常规变量。例如,如果您定义了一个名为“TotalAmount”的工作流变量,则可以使用以下代码读取变量值:
//Calculate comission for the sale
Comission := TotalAmount * 0.2;
2
并使用以下代码更改变量值:
//Increase TotalAmount by 15%
TotalAmount := TotalAmount * 1.15;
2
避免使用消息框和其他对话框或窗口,这些对话框或窗口需要用户交互才能继续脚本,这可能会导致问题。请记住,工作流在线程的后台运行,工作流执行的所有操作都应该是静默且流畅的。如果需要用户交互,通常需要使用任务块为用户创建任务。
# 9. 变量对话框
在直观地创建工作流定义时,您将使用对话框来编辑多个不同块的属性。这些块中的每一个都可能具有接受表达式的参数。在每个具有支持表达式的参数的对话框中,您都会找到一个名为“变量...”的按钮。,这将打开“变量”对话框。此对话框显示可在表达式中使用的所有变量,并允许您将指定的变量拖放到参数控件中。这将在控件中创建一个具有变量名称的表达式。